Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)

举报
Winter_world 发表于 2021/09/29 01:05:21 2021/09/29
【摘要】 目录 1、基本概念 2、static定义内部类 3、方法中定义内部类 4、总结 1、基本概念 类的组成包括:成员、方法,几乎所有程序都不会对嵌套程序有什么限定,内部类指的是在一个类中继续嵌套其他类结构的一种代码形式,且理论上可以一直嵌套。 【举例】:观察内部类 public class MainActivity ext...

目录

1、基本概念

2、static定义内部类

3、方法中定义内部类

4、总结


1、基本概念

类的组成包括:成员、方法,几乎所有程序都不会对嵌套程序有什么限定,内部类指的是在一个类中继续嵌套其他类结构的一种代码形式,且理论上可以一直嵌套。

【举例】:观察内部类


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. Outer o = new Outer();
  6. o.fun();
  7. }
  8. }
  9. class Outer{ //外部类
  10. private String info = "hello";
  11. class Inner{ //内部类
  12. public void print(){
  13. System.out.println(info);
  14. }
  15. }
  16. public void fun(){
  17. Inner inner = new Inner();
  18. inner.print();
  19. }
  20. }

类本身的核心组成就应该是属性和方法,但是引用了内部类的话,程序结构就被破坏了,那么内部类的好处在哪?若将内部类拿出,变为两个类,程序改动非常大,内部类的最大好处就是可以直接进行外部类的私有属性访问。

现在有以下几个问题:

(1)在编写代码中,只要是属性的访问,一定要加this,但由于属性是外部类的,所以需要:外部类.this.属性;


  
  1. class Outer{ //外部类
  2. private String info = "hello";
  3. class Inner{ //内部类
  4. public void print(){
  5. System.out.println(Outer.this.info);
  6. }
  7. }
  8. public void fun(){
  9. Inner inner = new Inner();
  10. inner.print();
  11. }
  12. }

(2)以上代码,内部类可以方便操作外部类私有属性,那么外部类是否可以访问内部类的私有属性:答案,是


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Outer o = new Outer();
  4. o.fun();
  5. }
  6. class Outer{ //外部类
  7. private String info = "hello";
  8. class Inner{ //内部类
  9. private String msg = "world";
  10. public void print(){
  11. System.out.println(Outer.this.info);
  12. }
  13. }
  14. public void fun(){
  15. Inner inner = new Inner();
  16. inner.print();
  17. System.out.println(inner.msg);
  18. }
  19. }

由以上可知,内部类和外部类的私有属性是可以直接访问的。

(3)目前可发现,实例化内部类的对象操作都是在外部类的fun()方法里面完成的,其他类是否可以直接操作内部类对象,在其他类中实例化内部类对象,语法如下:

  • 外部类名称.内部类名称 对象名称 = new 外部类().new 内部类();

  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. Outer.Inner inner = new Outer().new Inner();
  6. inner.print();
  7. }
  8. }
  9. class Outer{ //外部类
  10. private String info = "hello";
  11. class Inner{ //内部类
  12. private String msg = "world";
  13. public void print(){
  14. System.out.println(Outer.this.info);
  15. }
  16. }
  17. public void fun(){
  18. Inner inner = new Inner();
  19. inner.print();
  20. System.out.println(inner.msg);
  21. }
  22. }

(4)内部类可以通过private定义为私有内部类,仅可以被其外部类使用


  
  1. class Outer{ //外部类
  2. private String info = "hello";
  3. private class Inner{ //内部类
  4. private String msg = "world";
  5. public void print(){
  6. System.out.println(Outer.this.info);
  7. }
  8. }
  9. public void fun(){
  10. Inner inner = new Inner();
  11. inner.print();
  12. System.out.println(inner.msg);
  13. }
  14. }

2、static定义内部类

利用static定义的 属性和方法是不受类的控制的,相当于一个局外结构,如果内部类使用了static定义,那么此内部类就相当于变成了外部类,只能访问外部类的static属性。

【举例】:利用static定义内部类


  
  1. class Outer{ //外部类
  2. private static String info = "hello";
  3. static class Inner{ //static内部类 = 外部类
  4. private String msg = "world";
  5. public void print(){
  6. System.out.println(info);
  7. }
  8. }
  9. public void fun(){
  10. Inner inner = new Inner();
  11. inner.print();
  12. System.out.println(inner.msg);
  13. }
  14. }

既然static内部类变成了外部类,那么外部类就可以被其他类直接进行操作。但是这时候的实例化格式为:

  • 外部类名称.内部类名称 对象名称 = new 外部类.内部类();

   
  1. Outer.Inner inner = new Outer.Inner();
  2. inner.print();

后续开发中,我们见到的程序类库中出现xxx.xxx就表示的是内部类。

3、方法中定义内部类

理论上内部类可以在任何位置中定义,包括:代码块、类中、方法中,实际开发中,有可能在方法中使用内部类。

【举例】:方法中写内部类


   
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. Outer outer = new Outer();
  6. outer.fun(100);
  7. }
  8. }
  9. class Outer{ //外部类
  10. private String info = "hello";
  11. public void fun(int temp){
  12. double sal = 9000.0;
  13. class Inner{
  14. public void print(){
  15. System.out.println("Outer类中的info属性="+Outer.this.info);
  16. System.out.println("fun()方法中的参数temp="+temp);
  17. System.out.println("fun()方法中定义的临时变量sal="+sal);
  18. }
  19. }
  20. new Inner().print();
  21. }
  22. }

【注意】:目前使用的是JDK1.8,如果是1.8以前的版本,一个方法中定义的内部类要访问方法的参数或定义的变量,那么参数或变量前必须要加final。

4、总结

  • 1)不需要考虑怎么用内部类,一般开发用的较少,但是会使用;
  • 2)内部类先看明白它的语法形式。

 

作于202004091950,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/105375508

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。