内部类

内部类

【摘要】内部类~

前言

一般情况,我们把类定义成独立的单元。但在有些情况下,我们将一个类定义在另外一个类或者另外一个方法当中,这样的类称为内部类。

内部类

在Java中,由于内部类所处的“位置”不同,可以分为以下几种不同的内部类:

成员内部类

把内部类当做普通属性存在,可以使用private/default/protected/public任意进行修饰。类文件:外部类$内部类.class。

非静态内部类

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Outer {
//属性
private int i;
//成员内部类
private class Inner {
//内部类的属性
private int j;
//...

//内部类的方法
public void innerF() {
//...
System.out.println("outer: "+i); //访问外部类成员
}
} //end of inner class

private Inner inner;

public Outer(int i) {
this.i = i; //外界传入
this.inner = new Inner(); //组合
}

//外部类的方法
public void outerF() { .... }
} // end of outer class

静态内部类

1
2
3
4
5
6
7
8
9
10
11
class Outer{
//相当于外部类的一个静态成员
static class Inner{
}
}
public class TestStaticInnerClass {
public static void main(String[] args) {
//通过 new 外部类名.内部类名() 来创建内部类对象
Outer.Inner inner =new Outer.Inner();
}
}

局部内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
public void show() {
//作用域仅限于该方法
class Inner {
public void fun() {
System.out.println("helloworld");
}
}
new Inner().fun();
}
public static void main(String[] args) {
new Test2().show();
}
}

匿名内部类

适合那种只需要使用一次的类。比如:键盘监听操作等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
this.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
myTank.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
myTank.keyReleased(e);
}
}
);

总结

内部类的优点:
A. 可以直接访问所在外部类的成员
B. 对于外部类来说,封装性更好。
缺点:
语法古怪,不方便使用。

应用:

考虑如下问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface Runnable {
void run();
}
//还有一个抽象类
public abstract class Person {
//有一个方法
public abstract void run();
}

//现在我们要写一个类,即要有Person的能力,也有要Runnable的能力,怎么办?
public class Teacher extends Person implements Runnable {
//
@Override
public void run() {
//此处,你实现的是“谁”的run?
}
}

在java中,此类问题可以看做是多重继承带来的问题,要用内部类来解决。
如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Teacher extends Person {
//...
@Override
public void run() {
//就是 Person的run
... 拥有Person的能力
//调用内部类的 run方法
//...拥有 Runnable的能力
}
//通过一个内部类来实现 Runnable 接口
class Inner implemensts Runnable {
@Override
public void run() {
//Runnable的 run
...
}
}
}

结束语

bye~

评论