使用引用变量调用方法
Method calling using reference variable
public class Base {
int var =0;
Base(){
System.out.println("Inside Base constructor .....");
setVar();
}
public void setVar(){
System.out.println("Inside base setVar method.....");
var+=10;
}
public int getVar(){
return var;
}
}
派生 Class:
public class Derived extends Base {
Derived(){
System.out.println("Inside Derived constructor .....");
setVar();
}
public void setVar(){
System.out.println("Inside Derived setVar method.....");
var+=20;
}
public static void main(String[] args){
Base b = new Derived();
System.out.println(b.getVar());
}
}
输出.......
Inside Base constructor .....
Inside Derived setVar method.....
Inside Derived constructor .....
Inside Derived setVar method.....
40
问题 ----> 为什么当控制转到 base class 构造函数时,调用 Derived class 的 setVar() 方法而不是 Base class setVar() 方法。
我预计输出为 30 ,但是当 运行 这个处于调试模式的程序找到流程并得到输出 40 时。谁能解释一下这背后的逻辑。
谢谢
Java会根据变量的运行时间类型决定使用哪个方法运行,即始终使用多态,即使调用的方法来自基础 class 构造函数。
当基础class构造函数被调用时,多态性意味着调用class的派生版本setVar
,并添加20。然后调用派生的 class 构造函数,并再次调用派生的 class 版本的 setVar
,并添加 20,再次产生 40.
工作中的多态性。
当您在派生 class 中重写超级 class 方法时,当有人对派生 class 的任何对象进行操作时,派生 class 中总是会调用您重写的方法],哪怕那个人是超级class。
所以 Derived
setVar()
被调用了两次,因为它在“Derived
”中被覆盖,而您试图创建一个对象“Derived
” class.
public class Base {
int var =0;
Base(){
System.out.println("Inside Base constructor .....");
setVar();
}
public void setVar(){
System.out.println("Inside base setVar method.....");
var+=10;
}
public int getVar(){
return var;
}
}
派生 Class:
public class Derived extends Base {
Derived(){
System.out.println("Inside Derived constructor .....");
setVar();
}
public void setVar(){
System.out.println("Inside Derived setVar method.....");
var+=20;
}
public static void main(String[] args){
Base b = new Derived();
System.out.println(b.getVar());
}
}
输出.......
Inside Base constructor .....
Inside Derived setVar method.....
Inside Derived constructor .....
Inside Derived setVar method.....
40
问题 ----> 为什么当控制转到 base class 构造函数时,调用 Derived class 的 setVar() 方法而不是 Base class setVar() 方法。 我预计输出为 30 ,但是当 运行 这个处于调试模式的程序找到流程并得到输出 40 时。谁能解释一下这背后的逻辑。 谢谢
Java会根据变量的运行时间类型决定使用哪个方法运行,即始终使用多态,即使调用的方法来自基础 class 构造函数。
当基础class构造函数被调用时,多态性意味着调用class的派生版本setVar
,并添加20。然后调用派生的 class 构造函数,并再次调用派生的 class 版本的 setVar
,并添加 20,再次产生 40.
工作中的多态性。
当您在派生 class 中重写超级 class 方法时,当有人对派生 class 的任何对象进行操作时,派生 class 中总是会调用您重写的方法],哪怕那个人是超级class。
所以 Derived
setVar()
被调用了两次,因为它在“Derived
”中被覆盖,而您试图创建一个对象“Derived
” class.