Java基础--棉线对象高级(5)

0 阅读1分钟

内部类

  • 就是类中有嵌套了一个类:内部类
  • 如下图,Car和Engine还是有区别的,如果很多代码都这样写就容易堆积成石山代码;
  • 所以在类中又详细的划分了一个类Engine,这样能更清晰的描述Car的属性;

image.png

内部类的分类

image.png

1. 成员内部类

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

image.png

获取成员内部类对象的两种方式:

  • 创建内部类对象的格式:(内部类:Inner 、 外部类: Outer)
  Outer.Inner oi = new Outer().new Inner();
  • 带成员内部类被private修饰时:在外部编写方法,对外提供内部类对象;
public class Outer{
    String name;
    
    private class Inner{
    }
    
    public Inner getInstance(){
    return new Inner()
    }
}

测试类:

Outer o = new Outer();
o.getInstance();//获取内部类的都对象

外部类成员变量和内部类成员变量重名时,在内部类如何访问?

  • 内部类中隐含着一个通向外部类的通道 Outer.this
sout(Outer.this.变量名);

静态内部类

image.png

代码演示:

image.png

局部内部类

image.png

匿名内部类(重要)

image.png

要求:在测试类中调用goSwimming方法

  • 传统方式:
  • Student:实现右侧接口,重写方法;
  • 注意调用方法goSwimmin时,需要传递这个接口的实现类对象; image.png

问题:如果Student只用一次,单独创建Java文件是否浪费呢?

  • 这时候就要用到匿名内部类了
  • 使用匿名内部类的解法:
  • 匿名内部类的定义格式 = 没有名字的java类 + 继承/实现 + 重写方法 + 创建对象;
  • 最终可以理解为:一个没有名字的java类对象;

image.png

  • 上下两种形式是相同的,都是多态;

image.png