java基础学习 day50(内部类,成员内部类,静态内部类,局部内部类 )

1. 什么是内部类?
写在一个类里面的类就叫做内部类

2. 什么时候用到内部类?
B类表示的事物是A类的一部分,且B单独存在没有意义。
比如:汽车和发动机,ArrayList和迭代器,人和心脏

3. 内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建内部类对象
    如图:
    在这里插入图片描述

4. 内部类的分类
a. 成员内部类:写在成员位置的,且不用static修饰
b. 静态内部类:用static修饰的,写在成员位置的
c. 局部内部类:写在方法里的
d. 匿名内部类:没有名字的

5. 成员内部类

  • 写在成员位置的,属于外部类的成员,如图
    在这里插入图片描述
  • 成员内部类可以被一些修饰符所修饰,比如:private,默认/空着不写,protected,public,static等,并遵守对应的范围规则
  • 在成员内部类里面,JDK16以前不能定义静态变量,JDK16开始才可以定义静态变量
  • 获取成员内部类对象的两种方式:
    a. 在外部类中编写方法,通过返回值对外提供内部类对象
    b. 直接创建
    格式:外部类名. 内部类名 对象名 = new 外部类名( ). new 内部类名( ) ;
    范例1:Outer. Inner oi = new Outer( ). new Inner( ) ;
    //这种方式创建的内部类,他所对应的外部类,我们不能手动指定,是程序自己创建的
    范例2:Outer o = new Outer( ) ;
          Inner oi = o. new Inner( ) ;
    //这与上面的范例等价,手动定义外部类,就可以指定外部类的名字,更方便

注意:当用private修饰内部类时,若外界想创建内部类对象,直接创建是不行的,有两种方法:
a. 更改private修饰符为public,就可直接创建
b. 在外部类中编写方法,通过返回值对外提供内部类对象。但此时,外界(其他外部类)无法通过内部类名来创建内部类对象名,从而无法接收内部类对象地址,此时可以通过内部类的父类(多态)来创建并接收(但在通过父类变量名调用时,又会导致编译看左边,运行看右边的问题),也可以不创建对象名并接收,直接用链式编程使用即可。

6. 成员内部类如何获取,与内部类成员变量重名的外部类的成员变量,如图:
在这里插入图片描述

  • Outer.this 指外部类对象的地址值
  • this 指该方法调用者 (内部类对象) 的地址值
  • 内存图:
    在这里插入图片描述
  • 内部类对象有一个隐藏的成员变量:this(地址值,指向外部类对象)
  • 外部类和内部类编译后是两个独立的字节码文件

7. 静态内部类

  • 静态内部类是一种特殊的成员内部类,即用static修饰的成员内部类,如图:
    在这里插入图片描述
  • 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建外部类的对象

8. 怎么直接创建静态内部类对象?

  • 格式:外部类名. 内部类名 对象名 = new 外部类名. 内部类名() ;
  • 例如:Outer. Inner oi = new Outer. Inner() ;

9. 如何调用静态内部类中的方法?

  • 非静态方法:先创建静态内部类对象,再用对象调用
  • 静态方法:外部类名. 内部类名. 方法名() ;

10. 局部内部类

  • 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量,不能用public,private等修饰符修饰(这是修饰成员的,不是修饰局部的),但可以用final来修饰,如图:
    在这里插入图片描述
  • 外界是无法直接使用局部内部类(如不能使用其他的局部变量),需要在包含局部内部类的方法内部,创建局部内部类对象并使用,如图:
    在这里插入图片描述
  • 局部内部类可以直接访问外部类的成员,也可以访问包含该局部内部类的方法内的局部变量,如图:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u011453680/article/details/129403641
今日推荐