Java 26 面向对象--内部类

98 阅读3分钟

1 . 什么是内部类?

类的五大成员: 属性、方法、构造方法、代码块、内部类。

内部类: 在一个类的里面,再定义一个类。例:在 A 类的内部定义 B 类,B 类就称为内部类。汽车的发动机、ArrayList的迭代器、人的心脏等。

2 . why内部类 ?

如下,汽车的例子,里面的发动机的相关信息应单独归属于发动机类,而且也不能单独在外面定义一个发动机类,没有意义,因为发动机应该依赖于其汽车而存在。

0948.png

3 . 内部类特点

  • 内部类表示的事物是外部类的一部分
  • 内部类单独出现是没有任何意义的

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建内部类的对象,通过对象访问调用。

4 . 内部类的分类

4 . 1 成员内部类:

写在成员位置的,属于外部类的成员。

0950.png

  • 成员内部类可以被一些修饰符所修饰,比如:private(只能在本类使用)、默认(本类、同一个包中的其他类)、protected(本类、同一个包中的其他类、不同包下的子类)、public(本类、同一个包中的其他类、不同包下的子类、不同包下的无关类)、static

4 . 1 . 2 获取成员内部类对象:

  • 法一: 在外部类中编写方法,对外提供内部类的对象(适用于成员内部类被 private修饰时)

0951.png

在测试类中调用:

0952.png

  • 法二: 直接创建 :外部类.内部类名 对象名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner()

4 . 1 . 3 成员内部类获取外部类的成员变量:

0954.png

  • 依次打印出来是 10 20 30

0953.png

4 . 2 静态内部类:

静态内部类成员内部类的一种。

  • 静态内部类只能访问外部类中的静态变量和静态方法。

  • 如果想要访问非静态的需要在内部类里面创建外部类的对象,再调用。

4 . 2 . 1 创建静态内部类对象的格式:

外部类名.内部类名 对象名 = new 外部类名.内部类名();
// Outer.Inner oi = new Outer.Inner();

4 . 2 . 2 调用静态内部类里的方法:

  • 非静态方法:先创建对象,用对象调用

  • 静态方法,可以直接用类名点获取,如下:

// Outer.Inner.show();

4 . 3 局部内部类:

将内部类定义在方法里面就叫局部内部类,类似于方法里面的局部变量。(局部内部类是不能被public修饰的)

  • 外界是无法直接使用,需要在方法内部创建对象并使用
  • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

4 . 4 匿名内部类:

本质上就是隐藏了名字的内部类。可以写在成员位置,也可以写在内部位置。

0955.png

上述代码蕴含了三步:继承/实现方法重写创建对象

0956.png

  • 可以作为参数传进方法进行调用
method(
   new Swim(){
   @Override
   public void swim(){
      System.out.println("帅惨了");
   }
 }
);
  • 可以直接在后面调用方法
new Swim(){
   @Override
   public void swim(){
      System.out.println("帅惨了");
   }
}.swim() ;