我想了解这段代码背后的逻辑:
public class AA
{
private int num;
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
public AA(int num) {
this.num = num;
}
public int f(AA val)
{
num = val.num;
return num;
}
}
BB级:
public class BB extends AA
{
public BB(int num) {
super(num);
}
public int f(BB val)
{
setNum(val.getNum()*2);
return getNum();
}
}
主:
public static void main(String[] args) throws Exception
{
AA y1 = new BB(2);
BB y2 = new BB(3);
System.out.println(y1.f(y2));
为什么输出是3而不是6?
编辑 - 我知道这不是最重要的。我的问题是为什么它没有调用BB的f?我发了BB变量。不是AA。我理解,如果在编译时它会选择A的f,但之后需要选择B&f 39。
我尝试将此添加到AA并打印6 ..
public int f(BB val)
{
System.out.println("Im here");
num =1+ val.getNum()*2;
return num;
}
答案 0 :(得分:0)
没有方法覆盖,
public int f(AA val)
和
public int f(BB val)
没有相同的签名。
当您致电y1.f(y2)
(y1
类型为AA
且y2
类型为BB
时):
AA
没有f(BB)
方法,因此最近的方法是f(AA)
,而BB
不会覆盖此方法
答案 1 :(得分:0)
您显然是从 y1 调用函数(f),这是 AA 引用类型。