这个升级演示是如何工作的?
how is this upcasting demo working?
我已经创建了一个向上转换演示,但我不明白这段代码是如何工作的,或者我可以更具体地说为什么在使用 Derived class.And 甚至没有调用基础 class.I 的构造函数,甚至没有在任何地方使用 super 关键字比基础 class 的构造函数如何调用。
class Base{
int value =0;
Base(){
addValue();
}
void addValue(){
value+=10;
}
int getValue(){
return value;
}
}
class Derived extends Base{
Derived()
{
addValue();
}
void addValue(){
value+=20;
}
}
class Test{
public static void main(String args[]){
Base b=new Derived();
System.out.println(b.getValue());
}
}
Derived 对象是一个 Base 对象,再加上更多。 Java,像大多数语言一样,需要构造整个对象,包括由 Base 构造函数初始化的部分。
看是这样的:初始值设置为0是做什么用的?这不也是 Base 代码的一部分吗?
Java 允许您指定要与 super
一起使用的 base-class 构造函数(如果您愿意),但如果您不指定一个,它会选择一个。这些规则可能很复杂,但在这种情况下它们很简单:无参数 Base 构造函数从无参数 Derived 构造函数调用。
作为测试,将 Base() 构造函数设置为私有并查看编译器告诉您的内容。
当您创建一个新的 Derived
对象时,将调用其构造函数。由于 Derived
有一个超类 Base
,它的构造函数将首先被调用。在构造函数中,将调用覆盖的方法addValue
,这导致临时值为20。之后,调用Derived
的addValue
并将另一个20添加到value
.最后的结果是40.
因为您没有使用 super
自己调用超类的构造函数,Java 会自动执行此操作:
Derived() {
super();
addValue();
}
我已经创建了一个向上转换演示,但我不明白这段代码是如何工作的,或者我可以更具体地说为什么在使用 Derived class.And 甚至没有调用基础 class.I 的构造函数,甚至没有在任何地方使用 super 关键字比基础 class 的构造函数如何调用。
class Base{
int value =0;
Base(){
addValue();
}
void addValue(){
value+=10;
}
int getValue(){
return value;
}
}
class Derived extends Base{
Derived()
{
addValue();
}
void addValue(){
value+=20;
}
}
class Test{
public static void main(String args[]){
Base b=new Derived();
System.out.println(b.getValue());
}
}
Derived 对象是一个 Base 对象,再加上更多。 Java,像大多数语言一样,需要构造整个对象,包括由 Base 构造函数初始化的部分。
看是这样的:初始值设置为0是做什么用的?这不也是 Base 代码的一部分吗?
Java 允许您指定要与 super
一起使用的 base-class 构造函数(如果您愿意),但如果您不指定一个,它会选择一个。这些规则可能很复杂,但在这种情况下它们很简单:无参数 Base 构造函数从无参数 Derived 构造函数调用。
作为测试,将 Base() 构造函数设置为私有并查看编译器告诉您的内容。
当您创建一个新的 Derived
对象时,将调用其构造函数。由于 Derived
有一个超类 Base
,它的构造函数将首先被调用。在构造函数中,将调用覆盖的方法addValue
,这导致临时值为20。之后,调用Derived
的addValue
并将另一个20添加到value
.最后的结果是40.
因为您没有使用 super
自己调用超类的构造函数,Java 会自动执行此操作:
Derived() {
super();
addValue();
}