内部类protected所产生的问题
今天在think in java看到一个很有趣的题
1.在第一个包中创建一个至少有一个方法的接口
package chapter10.innerclass1;
public interface Vehic {
void run();
}
2.在第二个包中创建一个类,在其中增加一个protected的内部类以实现那个接口
import chapter10.innerclass1.Vehic;
public class Demo {
protected class Car implements Vehic {
@Override
public void run() {
System.out.println("Car run");
}
}
}
3.在第三个包中,继承这个类,并在一个方法中返回该protected内部类的对象,在返回的时候向上转型为第一个包中的接口类型
package chapter10.innerclass3;
import chapter10.innerclass1.Vehic;
import chapter10.innerclass2.Demo;
public class Test extends Demo {
public Vehic getVehic() {
Demo d = new Demo();
return d.new Car();//编译器在这里提示了报错 The constructor Demo.Car() is not visible
}
}
问题已经很明显了 Car这个内部类是protected修饰的,如果一个类没有定义任何构造函数,Java编译器会默认的给类生成一个空参数构造函数,而这个构造函数的访问级别是和类访问级别相同的,所以产生了报错,因为Test并不是Car的子类且不在Demo类的同一个包中,解决方案有两种。
1.把Test类移动到Demo类的包下面
2.给Car对象添加一个public的构造函数
package chapter10.innerclass2;
import chapter10.innerclass1.Vehic;
public class Demo {
protected class Car implements Vehic {
public Car() {}
@Override
public void run() {
System.out.println("Car run");
}
}
}