java - 如何访问protected静态内部类?
高洛峰
高洛峰 2017-04-17 17:48:11
0
2
325

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(2)
Ty80

A B Pakej yang berbeza akan melaporkan ralat kerana pembina A.AInner ialah pembina lalai, dan tahap akses lalai membenarkan subkelas dalam pakej yang sama menggunakan .
Jadi, jika anda boleh menukar kelas A maka anda boleh menulis pembina peringkat yang dibayangkan atau awam.

public AInner(){
}

Jika anda tidak menukar kelas A, anda boleh melihat ini.
Saya menulis demo yang boleh diakses.

Struktur

Kategori A:

package demo;

public class A {

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

}

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

}
刘奇

Kenapa? protectedJulat keterlihatan ditentukan oleh julat keterlihatan, boleh dilihat dalam pakej dan kelas yang diwarisi.
Bagaimana untuk mengakses? Jika anda mesti memaksa akses, cuma ubah suai keterlihatan melalui refleksi.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan