这一章节我们来讨论一下为什么需要内部类?
答案:为实现多重继承提供便利。
在实现多重继承方面有两种方式:内部类以及接口。
1.接口
package com.ray.ch08;
public class Sequence implements A, B {
}
interface A {
}
interface B {
}
接口其实不用多说,你实现多少个都可以,然后只有根据接口就可以向上转型,调用相关的方法。
2.内部类
当我们需要继承实现的是类或者抽象类,根据语法规则,是不可以多重继承的,那么现在内部类就发挥作用了。
package com.ray.ch08;
public class Sequence implements A, B {
class C implements A, B {
}
}
interface A {
}
interface B {
}
package com.ray.ch08;
public class Sequence extends A {
class C extends A {
}
}
abstract class A {
}
从上面的代码看出,无论外部类实现什么接口或者继承什么类,对于内部类来说都是没有任何影响。
注意:只有在需要实现多重继承的时候才考虑内部类,不然一般不使用这种复杂的编程方式,因为影响代码的可读性。
当使用内部类之后,将获得以下特性:
(1)内部类可以有多个实例,而且实例跟外部类之间的通信是分开的。
package com.ray.ch08;
public class Sequence extends A {
private int id = 0;
class C extends A {
public void setId(int id1) {
System.out.println(id);
id = id1;
}
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public static void main(String[] args) {
Sequence sequence1 = new Sequence();
C c1 = sequence1.new C();
c1.setId(2);
System.out.println(sequence1.getId());
Sequence sequence2 = new Sequence();
C c2 = sequence2.new C();
c2.setId(3);
System.out.println(sequence2.getId());
}
}
abstract class A {
}
输出:
0
2
0
3
从输出可以看见,虽然我们在第一次new C的时候改变了id,但是在第二此new C的时候是不受改变,因为它们分属不同实例,各自具有独立的状态。
(2)在单个外部类,里面的内部类可以使用不同的方式来实现同一个接口或者继承同一个类。
package com.ray.ch08;
public class Sequence {
class B implements A {
@Override
public void run() {
System.out.println("run1");
}
}
class C implements A {
@Override
public void run() {
System.out.println("run2");
}
}
public static void main(String[] args) {
}
}
interface A {
void run();
}
总结:这一章节主要说明了为什么需要内部类,就是多重继承,当然一般我们是用不上的。
这一章节就到这里,谢谢。
-----------------------------------