C++有多重继承的功能,虽很强大,但难于应用,复杂度非常大,过度使用会使代码庞大拥挤,类功能不单一等缺点。java实行单一继承多接口原则,大大简化了复杂度,用多接口在某一方面代替了多继承,但如果要在本类具体实现多继承,接口是不能做到的。这时,内部类能够实现这一功能。
java内部的类有内部类和嵌套类两种。
一、内部类:
内部类是定义在一个类里面的类,可以说是类中类,而该类又称为外围类。如下:
class Outer {
class Inner {
}
}
Outer是外围类,Inner是Outer类的内部类,内部类有权访问外围类所有成员和方法(包括静态和非静态),而外围类不能访问内部类的成员,只能通过new实例进行调用。内部类还可添加访问权限修饰符,如private,public,protected,其权限跟外围类相同。
在客户端创建使用new.,如 Outer.Inner inner = new Outer.new Inner(); 注:如果声明private则外部无权限创建。在new Inner的同时,JVM会隐式向Inner实例传入Outer的实例,如果要在Inner里访问外围类实例,则用Outer.this即可。
用内部类实现C++多重继承:
Class Outer {
class Inner1 expands 父类1 {
}
class Inner2 expands 父类2 {
}
...
}
要继承多少就有多少,然后根据Outer里实现多继承逻辑,对外界来说就相当于继承多类的功能一样。
继承内部类,必须在类里构造方法传入外转类的参数实例,并且在方法里显式调用外围类的super(); 如:
class SubInner expands Outer.Inner {
public SubInner(Outer outer) {
outer.super();
}
}
内部类优点:
1.变相实现多重继承功能,使类变的更强大。
2.每个内部类可实现不同接口,来完成一小部分功能;且每个内部类可以有不同的状态。
3.内部类可访问外转类所有成员和方法,又不会过份干扰外围类,内部类之间更不会互相干扰。
缺点:
增加了外围类的代码层级,不好维护。
相比之下,还是优点多过缺点。
二、嵌套类:
嵌套类是定义在类内部的静态类,是用static修饰,嵌套类也可继承类和实现接口。嵌套类只能访问外围类的静态成员。定义如下:
Class Outer {
static StaticInner {
}
}
在客户端调用:
Outer.StaticInner staticInner = new Outer.StaticInner(); // 这时不需要传入外围类的实例。注:嵌套类也可用访问修饰符。
无论是内部类还是嵌套类,编译器都会为每个类编译一个对应的.class文件,内部类或嵌套类用$分隔,如Outer$Inner.class和Outer$StaticInner.class。
三、局部内部类:
上面两种都是定义在类里中的域里,除此之外,内部类还可定义在方法体里,这种叫局部内部类。形式如下:
Class Outer {
private void run(final int temp) { // 在局部内部类里要访问temp变量,必须声明final,但java8已经做了优化,不用final,但在代码体内不能修改temp值
class FunInner {
void exec() {
System.out.println(temp);
}
}
FunInner funInner = new FunInner();
}
}
java可支持无限方法嵌套内部类。如果要访问外围类实例,则一样用"外围类.this"。注:局部内部类不能加任意修饰符,如private,static等,final除外。
另:
接口也可声明嵌套类,如果未指定static,默认隐式编译为static