Maison > Questions et réponses > le corps du texte
如何访问一个受保护的静态内部类?
public class A{
protected static class AInner{
public void test(){
}
}
}
public class B extends A{
public void hello(){
//怎样才能访问AInner中的test方法呢?
}
}
为什么当A和B在不同包中时,new AInner().test()
会编译报错呢?
而当A和B在同一个包中,却不会报错?
PHP中文网2017-04-17 17:50:11
A
B
Différents packages signaleront des erreurs car le constructeur de A.AInner est le constructeur par défaut et le niveau d'accès par défaut permet aux sous-classes du même package d'utiliser .
Donc, si vous pouvez changer la classe A, vous pouvez écrire un constructeur protégé ou de niveau public.
public AInner(){
}
Si vous ne changez pas la classe A
, vous pouvez regarder ceci.
J'ai écrit une démo accessible.
Structure
Catégorie A :
package demo;
public class A {
protected static class Test {
public void hello() {
System.out.println("hello");
}
}
}
Catégorie B :
package test;
import demo.A;
public class B extends A {
public static void main(String[] args) {
// 这里B可以访问A的内部类,但不能访问内部类的构造器。
// 所以这里实际B只能构造自己的内部类,所以下面用private修饰了这里依旧可以访问。
// 所以这行代码实际是一种多态,父类类型变量指向子类引用。
// 等同 A.Test t = new B.BTest();
B.Test test = new B.BTest();
test.hello();
}
// 因为那个内部类的class是protected的所以B类可以访问A.Test的class
private static class BTest extends A.Test {
}
}
怪我咯2017-04-17 17:50:11
Pourquoi ? protected
La plage de visibilité est déterminée par la plage de visibilité, visible dans les packages et les classes héritées.
Comment y accéder ? Si vous devez forcer l'accès, modifiez simplement la visibilité par réflexion.