- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设您有以下代码
class A {
int i = 4;
A() {
print();
}
void print () {
System.out.println("A");
}
}
class B extends A {
int i = 2; //"this line"
public static void main(String[] args){
A a = new B();
a.print();
}
void print () {
System.out.println(i);
}
}
这将打印 0 2
现在,如果删除标有“此行”的行代码将打印 4 4
A a = new B();
将调用类 A,将 i 初始化为 4,调用构造函数,
它将控制权交给 B 类
中的 print()
方法,最后打印 4。
a.print()
将调用 B 类中的 print()
方法,因为这些方法将在运行时绑定(bind),这也将使用 A 类中定义的值, 4.
(当然,如果我的推理有任何错误,请告诉我)
为什么插入代码后,第一部分(创建对象)会突然打印 0 而不是 4?为什么它不将变量初始化为 i=4,而是分配默认值?
最佳答案
它是 Java 中几种行为的组合。
我将简单地回顾一下您的代码中发生的情况,看看您是否理解。
您的代码在概念上如下所示(跳过 main()):
class A {
int i = 0; // default value
A() {
A::i = 4; // originally in initialization statement
print();
}
void print () {
System.out.println("A");
}
}
class B extends A {
int i = 0; // Remember this shadows A::i
public B() {
super();
B::i = 2;
}
void print () {
System.out.println(i);
}
}
因此,当在原始 main()
中调用 A a = new B();
时,它正在构造一个 B
,发生这种情况:
A::i
和 B::i
均为默认值 0
A::i
设置为 4print()
被调用。由于后期绑定(bind),它被绑定(bind)到 B::print()
B::print()
正在尝试打印 B::i
,它仍然是 0B::i
设置为 2然后,当您在 main()
中调用 a.print()
时,它会绑定(bind)到 B::print()
,其中正在打印 B::i
(此时为 2)。
因此您看到的结果
关于java - 变量多态性的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60268009/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!