java测试继承和嵌套类的使用_java 内部类、嵌套类

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值