【摘要】内部类~
前言
一般情况,我们把类定义成独立的单元。但在有些情况下,我们将一个类定义在另外一个类或者另外一个方法当中,这样的类称为内部类。
内部类
在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); } } private Inner inner;
public Outer(int i) { this.i = i; this.inner = new Inner(); }
public void outerF() { .... } }
|
静态内部类
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) { 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(); }
public class Teacher extends Person implements Runnable { @Override public void 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的能力 } class Inner implemensts Runnable { @Override public void run() { ... } } }
|
结束语
bye~