java – 在父级和子级中初始化实例变量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在父级和子级中初始化实例变量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1706字,纯文字阅读大概需要3分钟。
内容图文
![java – 在父级和子级中初始化实例变量](/upload/InfoBanner/zyjiaocheng/819/d51f47d26cb94634bfa84de7fe2522c3.jpg)
我有以下Java代码
public class Base {
private static boolean goo = true;
protected static boolean foo() {
goo = !goo;
return goo;
}
public String bar = "Base:" + foo();
public static void main(String[] args) {
Base base = new Sub();
System.out.println(base.bar);
}
}
public class Sub extends Base {
public String bar = "Sub:" + foo();
}
而且我被问到它会打印什么.在测试之后,答案似乎是Base:false,但我真的无法理解为什么它不是Sub:true.
它显示了具有两个同名变量的基数!一个有印刷的基础:假,另一个是预期的(由我)Sub:true.实际上foo()被调用两次但每次实例化一个不同的变量?不应该在子类中创建具有相同名称的变量(并在创建第一个之后初始化)覆盖父类中的变量吗? Java如何选择打印哪一个?
解决方法:
…which shows base having two variables with the same name!
对! base是对Sub实例的引用,该Sub实例有两个bar字段.我们称之为Base $bar和Sub $bar:
+------------------------+ base--->| Sub instance | +------------------------+ | Base$bar: "Base:false" | | Sub$bar: "Sub:true" | +------------------------+
Java允许在实例的类型层次结构中的不同级别使用相同的名称. (它必须:经常这些是私有字段,因此子类甚至可能不知道超类有一个具有相同名称的子类.)
实例中的这两个不同的字段具有不同的值:Base $bar具有值Base:false,因为它是基于对foo的第一次调用而初始化的,foo翻转goo(以true开头)并使用翻转的结果. Sub $bar的值为Sub:true,因为它是从第二次调用foo初始化的,所以goo再次翻转并使用更新的值.只创建了一个实例,但foo被调用了两次.
访问栏时看到的栏数取决于您对实例的引用类型.因为base声明为Base类型,所以当你执行base.bar时,你可以访问Sub实例中的Base $bar字段.如果您有对该实例的Sub引用,则您将访问Sub $bar:
System.out.println(base.bar); // "Base:false"
System.out.println(((Sub)base).bar); // "Sub:true"
内容总结
以上是互联网集市为您收集整理的java – 在父级和子级中初始化实例变量全部内容,希望文章能够帮你解决java – 在父级和子级中初始化实例变量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。