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、基本概念

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

【举例】:观察内部类


      public class MainActivity extends AppCompatActivity {
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
              Outer o = new Outer();
              o.fun();
          }
      }
      class Outer{ //外部类
         private String info = "hello";
         class Inner{ //内部类
             public void print(){
                  System.out.println(info);
              }
          }
         public void fun(){
              Inner inner = new Inner();
              inner.print();
          }
      }
  
 

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

现在有以下几个问题:

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


      class Outer{ //外部类
         private String info = "hello";
         class Inner{ //内部类
             public void print(){
                  System.out.println(Outer.this.info);
              }
          }
         public void fun(){
              Inner inner = new Inner();
              inner.print();
          }
      }
  
 

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


        protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
              Outer o = new Outer();
              o.fun();
          }
      class Outer{ //外部类
         private String info = "hello";
         class Inner{ //内部类
             private String msg = "world";
             public void print(){
                  System.out.println(Outer.this.info);
              }
          }
         public void fun(){
              Inner inner = new Inner();
              inner.print();
              System.out.println(inner.msg);
          }
      }
  
 

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

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

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

      public class MainActivity extends AppCompatActivity {
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
              Outer.Inner inner = new Outer().new Inner();
              inner.print();
          }
      }
      class Outer{ //外部类
         private String info = "hello";
         class Inner{ //内部类
             private String msg = "world";
             public void print(){
                  System.out.println(Outer.this.info);
              }
          }
         public void fun(){
              Inner inner = new Inner();
              inner.print();
              System.out.println(inner.msg);
          }
      }
  
 

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


      class Outer{ //外部类
         private String info = "hello";
         private class Inner{ //内部类
             private String msg = "world";
             public void print(){
                  System.out.println(Outer.this.info);
              }
          }
         public void fun(){
              Inner inner = new Inner();
              inner.print();
              System.out.println(inner.msg);
          }
      }
  
 

2、static定义内部类

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

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


      class Outer{ //外部类
         private static String info = "hello";
         static class Inner{ //static内部类 = 外部类
             private String msg = "world";
             public void print(){
                  System.out.println(info);
              }
          }
         public void fun(){
              Inner inner = new Inner();
              inner.print();
              System.out.println(inner.msg);
          }
      }
  
 

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

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

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

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

3、方法中定义内部类

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

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


       public class MainActivity extends AppCompatActivity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
               Outer outer = new Outer();
               outer.fun(100);
           }
       }
       class Outer{ //外部类
          private  String info = "hello";
          public void fun(int temp){
              double sal = 9000.0;
              class Inner{
                  public void print(){
                       System.out.println("Outer类中的info属性="+Outer.this.info);
                       System.out.println("fun()方法中的参数temp="+temp);
                       System.out.println("fun()方法中定义的临时变量sal="+sal);
                   }
               }
              new Inner().print();
           }
       }
   
  

【注意】:目前使用的是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个月内不可修改。