Java - 使用扩展类型重载方法选择
Java - Overloaded method selection with extended type
我想了解这段代码背后的逻辑:
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;
}
}
class 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。
我尝试将其添加到 AA 中,结果打印出 6..
public int f(BB val)
{
System.out.println("Im here");
num =1+ val.getNum()*2;
return num;
}
没有覆盖方法,
public int f(AA val)
和
public int f(BB val)
没有相同的签名。
当您调用 y1.f(y2)
时(y1
属于 AA
类型,y2
属于 BB
类型):
AA
没有 f(BB)
方法,所以调用最接近的方法 f(AA)
,并且 BB
不会覆盖此方法。
你显然是从 y1 调用一个函数 (f),它是一个 AA 引用类型。
我想了解这段代码背后的逻辑:
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;
}
}
class 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。
我尝试将其添加到 AA 中,结果打印出 6..
public int f(BB val)
{
System.out.println("Im here");
num =1+ val.getNum()*2;
return num;
}
没有覆盖方法,
public int f(AA val)
和
public int f(BB val)
没有相同的签名。
当您调用 y1.f(y2)
时(y1
属于 AA
类型,y2
属于 BB
类型):
AA
没有 f(BB)
方法,所以调用最接近的方法 f(AA)
,并且 BB
不会覆盖此方法。
你显然是从 y1 调用一个函数 (f),它是一个 AA 引用类型。