Java内部类

Posted on 2021-08-05 15:59  清烟无瘾  阅读(56)  评论(0)    收藏  举报

Java内部类

Java的类成员访问要求

静态成员不能访问非静态成员,外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例等。总之不允许在外部类的静态成员中直接使用非静态内部类。

  • 定义:把类定义在其他类的内部,这个类就被称为内部类。

  • 作用:

    • 可以实现细节隐藏

    • 可以实现多继承

    • 程序编写更高效或节省空间

    • 优化接口的实现

  • 访问特点:

    • 内部类可以直接访问外部类的成员,包括私有成员。因为内部类被当成其外部类的成员,同一个类的成员变量之间可以互相访问。

    • 但是外部类不能直接访问内部类的实现。外部类要访问内部类成员,必须创建对象

    • 注意,内部类和外部类之间并没有继承关系

  • 内部类比外部类多了三个使用修饰符private、protected、static--外部类不能使用这三个修饰符。非静态内部类不能拥有静态成员。

     

内部类的类型

  • 成员内部类

    • 非静态内部类 :非静态内部类里面不能有静态方法、静态成员变量、静态初始化。

    • 静态内部类:这个类属于外部类本身,而不属于外部类的某个对象。静态内部类中可以有静态和非静态的方法、成员变量。

  • 局部内部类:把一个类放在方法中,局部内部类仅在该方法中有效。

  • 匿名内部类:1、匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。因此不允许将匿名内部类定义成抽象类。2、匿名内部类不能定义构造器。由于匿名内部类没有类型,所以无法定义构造器,但匿名内部类可以定义初始化块,可以通过实例初始化块来完成构造需要完成的事情。

详解

成员内部类

  • 概述:创建在成员位置

  • 外界如何创建内部类对象:

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

 

  • 常见修饰符

    • private:一般来说内部类是不会让外部类直接访问的为了保证数据安全型,常用private来修饰内部类。

      • 用private修饰之后,在其他类里是直接访问不到内部类的,要采用如下访问方式:在成员方法中创建内部类对象,然后调用其方法。

         

    • static(静态内部类)

      • 为了访问数据方便,可以把内部类定义为static

      • 注意:

        • 被静态修饰的成员内部类只能访问外部类非静态成员

        • 静态内部类内部可以有静态方法也可以有非静态方法

        • 外部类不能直接访问静态内部类的实例成员,但可以使用静态内部类的类名作为调用来访问静态内部类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员

      • 访问方式:内部类名 对象名 = new 外部类名.内部类名();

局部内部类

  • 概述:如果把一个内部类定义在方法里面定义,等同一个局部变量,则这个内部类就是一个局部内部类。可以直接访问外部类的成员。

  • 访问方式:创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能。

  • 局部内部类访问局部变量的注意事项:

    • 局部变量必须使用final修饰:因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有马上从堆内存中消失,还要使用那个变量。为了让数据还能继续使用,就用final修饰,这样,在堆内存中存储的其实是一个常量值。

匿名内部类

  • 概述:匿名内部类的语法有些特别,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。因此匿名内部类适合创建那种只需要一次使用的类。

  • 格式:new 父类构造器|实现接口(){重写方法;}

  • 本质:一个继承了类或者实现了接口的子类匿名对象。