java -- 内部类

java中的内部类,按类型看大致可以分为3类,分别是:成员内部类局部内部类以及匿名内部类

成员内部类

形式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Outer{
int num = 10;

void speak(){
System.out.println("我是外部内中的方法speak");
}

class Inner{

void tell(){
System.out.println("我是成员内部类中的方法tell");
}
}
}

外部类Outer中位于成员位置,再定义一个类Inner,这个类就是Outer的内部类。

内部类在编译时,会生成自己对应的class文件,但它的访问要通过其外部类完成。

这里,我们要运行内部类Inner中的tell方法,流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test{
public static void main(String[] args){
//1.首先,要访问成员内部类,我们得先得到外部类`Outer`的对象
Outer o = new Outer();
//2.然后,通过外部类对象`o`得到内部类`Inner`
Inner i = o.new Inner();
//3.通过内部类对象`i`调用内部类方法`tell`
i.tell();

//以上可以简写为
new Outer().new Inner().tell();
}
}

如果,我们给Inner加上static修饰符,那么我们就能通过Outer.Inner调用内部类的class。进一步,要想获得Inner的对象,可以通过Outer.new Inner()获得。如果,Inner中的tell方法也加上static修饰符,我们直接通过Outer.Inner.tell(),就可以执行tell方法,整个过程没有实例化任何对象。

局部内部类

顾名思义,和局部变量类似,局部内部类是存在与方法体中的类,形式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Outer{
int num = 10;

void speak(){
System.out.println("我是外部内中的方法speak");

class Inner{
void tell(){
System.out.println("我是成员内部类中的方法tell");
}
}
//实例化局部内部类`Inner`,并调用其中的方法`tell`
Inner i = new Inner();
i.tell();
}
}

局部内部类的作用域范围仅局限于方法内部,出了方法之后就无法使用了

因此,无法在其他类,例如测试类Test中实例化局部内部类Inner,更不用说调用其中的tell方法了。

唯一的途径是,直接在Inner所在的方法体中,实例化Inner对象i,然后调用tell方法,如上所示。

匿名内部类

特点

  • 可以看做是一种没有名字的局部内部类
  • 定义在方法中
  • 必须在定义匿名内部类时创建它的对象

格式

1
2
3
4
new 类/接口(){
如果是创建了继承这个类的子类对象,我们可以重写父类的方法
如果是创建了实现这个接口的子类对象,我们必须实现接口的全部抽象方法
}

原理:创建了继承了这个类的子类对象或者实现了这个接口的子类对象

应用场景

​ 作为参数进行传递,因为只使用一次,无需专门写一个java文件继承父类或接口,直接通过匿名内部类的方式比较简洁。