如何访问protected静态内部类?

发布于 2022-09-02 14:30:03 字数 345 浏览 15 评论 0

如何访问一个受保护的静态内部类?

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在同一个包中,却不会报错?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

带上头具痛哭 2022-09-09 14:30:03

A B不同包会报错是因为 A.AInner的构造器是默认构造器,而默认访问级别是允许同包的子类使用的。
所以如果你可以改A类那么你可以写个 portected或者public级别的构造器。

public AInner(){
}

如果你不改A类,你可以看看这个。
我写了一个可以访问的demo。

结构
目录结构

A类:

package demo;

public class A {

    protected static class Test {
        public void hello() {
            System.out.println("hello");
        }
    }

}

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 {
    
    }

}
哥,最终变帅啦 2022-09-09 14:30:03

为什么?protected可见性范围决定的呀,包内、继承类内可见。
怎么访问?如果非要强制访问,通过反射修改可见性即可。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文