Java 获得此输出的可能原因是什么?
这是我在某个网站上发现的一个问题。代码是这样的Java 获得此输出的可能原因是什么?,java,methods,constructor,Java,Methods,Constructor,这是我在某个网站上发现的一个问题。代码是这样的 public class Test { public static void main(String[] args) { new B(); } } class A { int i = 7; public A() { setI(20); System.out.println("i from A is " + i); } public void setI(int i) { this.i = 2 *
public class Test {
public static void main(String[] args) {
new B();
}
}
class A {
int i = 7;
public A() {
setI(20);
System.out.println("i from A is " + i);
}
public void setI(int i) {
this.i = 2 * i;
}
}
class B extends A {
public B() {
// System.out.println("i from B is " + i);
}
public void setI(int i) {
this.i = 3 * i;
}
}
我想知道为什么这是我的输出是60,而不是40。提前感谢=)这是一个简单的多态性 您正在创建一个B对象,因此当a构造函数调用setI()时,它正在调用“B版本”(这导致3*20=60) 换句话说:当你在Java中对一个对象调用一个方法时,JVM会在运行时检查该对象是哪个具体的类;并调用它在该类上找到的方法。因此:setI()在其“B”版本中只被调用一次
当您将不同的打印行语句放入两个setter中时,您可以很容易地看出这一点。这是一个简单的多态性 您正在创建一个B对象,因此当a构造函数调用setI()时,它正在调用“B版本”(这导致3*20=60) 换句话说:当你在Java中对一个对象调用一个方法时,JVM会在运行时检查该对象是哪个具体的类;并调用它在该类上找到的方法。因此:setI()在其“B”版本中只被调用一次
当您将不同的打印行语句放入两个setter中时,您可以很容易地看出这一点。为什么您希望它是40?当你不表达你的想法时,很难纠正它。如果你期望它是40,那么你就完全忽略了多态性的概念。:)你为什么期望它是40?当你不表达你的想法时,很难纠正它。如果你期望它是40,那么你就完全忽略了多态性的概念。:)所以A中的方法setI()从未被调用。是吗?明白了。谢谢!!=)所以A中的方法setI()从未被调用。是吗?明白了。谢谢!!=)