gpt4 book ai didi

Java多态-如何判断是否调用父类(super class)方法和子类方法以及父类(super class)变量还是子类变量?

转载 作者:太空宇宙 更新时间:2023-11-04 10:06:49 25 4
gpt4 key购买 nike

示例代码:

public class A {

public int number;

public A(int number) {
this.number = number;
}

public int getNumber() {
return number;
}

}



public class B extends A{

public int number;

public B(int number) {
super(number);
}


public int getNumber() {
return number;
}

}


public class C {

public static void main(String args[]) {

A test1 = new B(2);
B test2 = new B(2);

System.out.println(test1.number) // prints 2
System.out.println(test2.number) // prints 0
System.out.println(test1.getNumber()) //prints 0
System.out.println(test2.getNumber()) // prints 0
}

}

如上所示test1.number不等于test1.getNumber()。

因此,当我将 test1 设为 A 类型的对象时,test1.number 引用的是 A 类中的 int 数字。

但是当我调用 test1.getNumber() 时,它正在调用 B 类中的 getNumber() ?

为什么会发生这种情况?

最佳答案

Java 中的所有方法都是虚拟的。我稍后会明白这意味着什么。

所以,在这一行:

A test1 = new B(2);

您已将 B 类的新实例分配给声明为保存 A 的变量。

当您使用 test1.number 时,您使用的是在类 A 中声明的 number 变量,假设 B 调用 super(number) 的构造函数将为 2。

但是,当您调用 test1.getNumber() 时,虚拟就会发挥作用。虚拟意味着它将始终调用构造类中的方法,而不是您将其声明为的变量类型。换句话说,它实际上不是像您想象的那样调用 AgetNumber,而是调用 BgetNumberB 的构造函数没有为 Bnumber 变量赋值,因此您得到 0。

关于Java多态-如何判断是否调用父类(super class)方法和子类方法以及父类(super class)变量还是子类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52808455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com