1 packagecom.test01;2
3 public classA {4 //内部类 B 继承 TestPojo 和实现 TestInterface 接口
5 class B extends TestPojo implementsTestInterface{6 //内部类 B 自己的方法
7 public voidrun(){8 System.out.println("我正在跑!");9 }10 //重写的接口方法
11 public voidtestf() {12 System.out.println("实现接口!");13 }14 }15 //方法里面调用内部类
16 public voidtest(){17 B b = newB() ;18 b.testf() ; //掉用重写接口方法
19 b.run() ; //调用自己的方法
20 b.testpojo() ; //调用继承父类的方法
21 }22 //main 方法测试
23 public static voidmain(String[] args) {24 A a = newA() ;25 a.test() ;26 }27 }28 //定义了一个接口 ,方法为testf()
29 interfaceTestInterface{30 public voidtestf() ;31 }32 //定义了一个普通类 方法testpojo()
33 classTestPojo{34 public voidtestpojo(){35 System.out.println("我是简单的pojo类");36 }37 }38 //实现 调用内部类里面的方法
39 classTextone{40 public static voidmain(String[] args) {41 A.B b = new A().new B() ; //调用类A里面的内部类B
42 /**等同于 下面代码43 * A a = new A() ;44 * A.B b = a.new B() ;45 **/
46 b.testf() ; //掉用重写接口方法
47 b.run() ; //调用自己的方法
48 b.testpojo() ; //调用继承父类的方法
49 }50 }
2、方法内部类
1 packagecom.test01;2
3 public classPerTest {4 public void test(){ //定义一个方法
5 class Ne{ //定义一个方法内部类
6 public void fle(){ //定义方法内部类的方法
7 System.out.println("我正在飞翔!");8 }9 } ;10 new Ne().fle() ; //调用内部类的方法
11 }12 public static voidmain(String[] args) {13 new PerTest().test() ; //测试
14 }15 }
注意: (1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,
局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!
例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变
量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。 (该理解来源于百度百科)
3、匿名内部类
1)、抽象匿名内部类
1 packagecom.anonymous;2
3 public classAbstractClass {4 public void test(){ //方法为test
5 TestA a = new TestA(){ //实现抽象类
6 @Override7 public void run() { //实现抽象类的方法
8 System.out.println("我正在使用抽象匿名内部类");9 }10 } ;11 a.run() ; //调用内部类的方法
12 }13 public static voidmain(String[] args) {14 new AbstractClass().test() ; //测试
15 }16 }17 //定义一个抽象类 TestA 抽象方法为run()
18 abstract classTestA{19 public abstract voidrun() ;20 }
2)、接口匿名内部类
1 packagecom.anonymous;2
3 public classTestAnonymous {4 MyInterface m = new MyInterface(){ //实现接口
5 public void eat() { //重写MyInterface 接口方法
6 System.out.println("我正在吃饭!");7 }8 } ;9 public void ss(){ //方法ss
10 m.eat() ; //调用重写的方法
11 }12 public static voidmain(String[] args) {13 new TestAnonymous().ss() ; //测试
14 }15 }16 //定义一个接口 方法为 eat
17 interfaceMyInterface{18 public voideat() ;19 }
注意:匿名内部 类 可以定义在方法内也可以定义在类的成员中,不管是那种匿名内部类都不能被外部类直接调用
四、内部类的作用?
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有
内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。
接口解决了部分问题,而内部类有效地实现了“多重继承”。