当前位置: 代码迷 >> J2SE >> 有关带有内部类的继承有关问题
  详细解决方案

有关带有内部类的继承有关问题

热度:69   发布时间:2016-04-24 12:31:39.0
有关带有内部类的继承问题
比如,我在一个包中,创建了类A,同时类A中有个protected内部类B,在另一个包中,我又创建了类C,类C是类A的子类,那么我能在C中直接访问类B吗??我在C中,直接创建类B的对象,不行,在将B中的构造器改成public后,就可以在C中直接创建了。请问为什么??就是带有内部类的继承,到底是什么机制原理。求助各路大神了。

------解决方案--------------------
Java code
package a;public class A {    protected class B {        B() { //构造器是非public的        }    }}package c;import a.*;public class C extends A {    public void someMethod() {        B b = new B(); // LZ是说这里有问题,对吧?         //首先,内部类可以看作外部类一个特殊的属性,那么父类protected B,子类可以直接访问B属性         //而B是个内部类,需要有构造方法,这样C虽然能访问B,但是能不能生成B的实例还要看B的构造方法的访问权限         //而例子中B的构造方法是默认访问方式的,只能是同一个包的子类可以调用,所以这样是不行的         //同样的,如果B的构造方法是protected,那么也不行,因为protected只允许子类访问         //但是可以在C中定义一个内部类继承B来调用B的构造器(B的子类可以访问protected构造器)         //如 class D extends B {D(){super();}} 这样是可以调用B的构造方法的         //而如果B的构造方法是public的,那么C就可以调用B的构造器来创建B的实例         //所以,可见,访问权限是一层一层往下走的         //也就是首先C要能访问B,其次C要能调用B的构造器    }}
------解决方案--------------------
同意楼上大牛的解释,补充一点java中的构造函数可以当成一个普通函数使用,只是没有返回值,但是返回的是一个当前类的对象,所以构造函数也有public的,希望对你有帮助
  相关解决方案