内部类

  内部类:定义在一个类的内部的类,成为内部类。包含内部类的类称为外部类。

  内部类有四种

   

  1、局部内部类(有名字,通常定义在方法中。)

    1)类体中可以直接访问外部类的所有成员,包括私有成员。

    2)不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能用修饰符的。但是可以使用final,因为局部变量可以用final。

    3)作用域:只在所定义的方法或代码块中。

    4)局部内部类如何访问外部类成员? ===> 直接访问

    5)外部类如何访问局部内部类成员? ===>在作用域内创建对象访问

    6)外部其他类不能访问局部内部类。若想执行局部内部类中的方法,只能在所定义的方法中(作用域内)创建局部内部类的对象,通过该对象访问。然后再外部其他类中创建外部类的对象,再访问其所在方法。

    7)如果外部类和局部内部类的成员重名,访问遵循就近原则。如果想访问外部类的成员,则可以使用 外部类名.this.成员   去访问。this指向外部类的对象。

 

  

  2、匿名内部类(没有名字,通常定义再方法中) ——> 相当重要!!!

    1)基于接口的匿名内部类

      基本语法:

      

      可以说,上述语法既定义了一个类,又创建了一个对象。该类的编译类型是接口类型,运行类型是系统底层自动生成的一个类(XXXX)。在系统底层的代码如下:

      

      XXXX是系统底层自动分配的类名,格式为: 外部类名$1  、外部类名$2、外部类名$3……(后面数字根据定义的顺序来决定)

      而JDK底层在创建这个类后,立即创建一个该类的对象实例,我们可以将该实例赋给相应的接口的引用。该类只能创建一个对象,在创建完后不能再使用,但这个对象是可以重复使用的。

      另外,基本语法中的花括号,可以理解为匿名内部类的类体。小括号不能去掉,也不能又实参列表,因为接口没有构造器。大括号后面的分号解释了这同时也是一个对象。

    

    2)基于内的匿名内部类

      基本语法:

            

      基本与上述一致,有两点不同:

        ①在系统底层的代码:

          

        ②实参列表:将会传给所继承的类的构造器。

 

ps.值得注意的是,如果将匿名内部类创建的对象赋给所实现的接口(或所继承的类)的引用,那么在使用该引用访问匿名内部类的方法时,有必要在原来的接口(或原来的类)中添加相应的方法,让匿名内部类完成重写。因为这个对象只能赋给原来的接口(或原来的类),所以编译类型只能是原来的接口或类。

小结:匿名内部类就是在底层会自动生成一个临时的类,这个临时的类会实现某个接口,或者是继承某个类,临时的类在形成后会立即创建一个对象,该对象可以被我们反复使用,而类只能用一次。

    

 

  3、成员内部类

     成员内部类是定义在外部类的成员位置的类,并且没有static修饰。

      1)可以直接访问外部类的所有成员,包含私有成员。

      2)可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员。

      3)作用域和外部类的其他成员一样,只在外部类的里面。

      4)成员内部类如何访问外部类的成员? ===>直接访问

      5)外部类如何访问成员内部类?  ===> 创建对象,再访问。

      6)外部其他类如何访问成员内部类?

      ①创建外部类的对象,把成员内部类视为外部类的一个成员。如:

          

        把new Inner()视为一个成员就可以了。在调用方法 f1( ) 时,又可以视为一个对象。

      ②在外部类编写一个方法,返回一个成员内部类的对象。

     7)如果外部类和局部内部类的成员重名,访问遵循就近原则。如果想访问外部类的成员,则可以使用 外部类名.this.成员   去访问。this指向外部类的对象。

  

  4、静态内部类

    静态内部类是定义在外部类的成员位置,并且有static修饰的类。

        1)可以直接访问外部类的所有成员,包含私有成员。

        2)可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员。

        3)作用域和外部类的其他成员一样,只在外部类的里面。

        4)成员内部类如何访问外部类的成员? ===>直接访问

        5)外部类如何访问成员内部类?  ===> 创建对象,再访问。

     6)外部其他类如何访问成员内部类?

        ①因为是静态的,是可以通过类名直接访问(前提是满足访问权限)

        ②编写一个方法,可以返回静态内部类的对象实例。

 

 

 

          

      

      

 

posted @   已经学到HelloWorld了  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示