栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

访问超类的私有字段

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

访问超类的私有字段

内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。

语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。

为了使其工作,编译器会生成桥接方法。上面示例中的javap与Main $ A一起使用看起来像这样:

注意access $ 200和access $ 300的添加。它们分别提供对私有方法和字段的后门访问。

class Main$A {  Main$A(Main$1);    Code:       0: aload_0   1: invokespecial #3       // Method "<init>":()V       4: return  static void access$200(Main$A);    Code:       0: aload_0   1: invokespecial #2       // Method foo:()V       4: return  static int access$300(Main$A);    Code:       0: aload_0   1: getfield      #1       // Field a:I       4: ireturn       }

为了完整起见,这是Main $ B的生成代码。注意对access $
200和300的调用,它们出现在Java代码中super.a和super.foo()的位置。

class Main$B extends Main$A {  public Main$B();    Code:       0: aload_0   1: aconst_null          2: invokespecial #1       // Method Main$A."<init>":(LMain$1;)V       5: aload_0   6: invokestatic  #2       // Method Main$A.access$100:(LMain$A;)V       9: getstatic     #3       // Field java/lang/System.out:Ljava/io/PrintStream;      12: aload_0  13: invokestatic  #4       // Method Main$A.access$200:(LMain$A;)I      16: invokevirtual #5       // Method java/io/PrintStream.println:(I)V      19: return        }

如果合法,为什么只能通过“ super.XXX”构造实现?

私有字段通常不属于编译器用于字段的解析路径的一部分,通过迫使开发人员指定超级字段,编译器可以确定私有访问是什么意思,而不是错误。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/610298.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号