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的构造器 } }
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的构造器
}
}