class Base2{
static int value = 0;
Base2(){
addValue();
}
static void addValue(){
value += 10;
}
int getValue(){
return value;
}
}
class Derived2 extends Base2{
Derived2(){
addValue();
}
static void addValue(){
value += 20;
}
}
public class Test7 {
public static void main(String[] args){
Base2 b = new Derived2();
System.out.println(b.getValue());
}
}
为什么输出 30
class Base1{
int value = 0;
Base1(){
addValue();
}
void addValue(){
value += 10;
}
int getValue(){
return value;
}
}
class Derived1 extends Base1{
Derived1(){
addValue();
}
void addValue(){
value += 20;
}
}
public class Test6 {
public static void main(String[] args){
Base1 b = new Derived1();
System.out.println(b.getValue());
}
}
为什么输出 40
static int value = 0;
Base2(){
addValue();
}
static void addValue(){
value += 10;
}
int getValue(){
return value;
}
}
class Derived2 extends Base2{
Derived2(){
addValue();
}
static void addValue(){
value += 20;
}
}
public class Test7 {
public static void main(String[] args){
Base2 b = new Derived2();
System.out.println(b.getValue());
}
}
为什么输出 30
class Base1{
int value = 0;
Base1(){
addValue();
}
void addValue(){
value += 10;
}
int getValue(){
return value;
}
}
class Derived1 extends Base1{
Derived1(){
addValue();
}
void addValue(){
value += 20;
}
}
public class Test6 {
public static void main(String[] args){
Base1 b = new Derived1();
System.out.println(b.getValue());
}
}
为什么输出 40
初始化的顺序包括构造方法调用的顺序如下:
1. Base2的静态成员value 首先初始化。
2. Base2的构造方法按照从最高到最低的顺序被调用。
3. Derived2的非静态对象(变量)初始化。
4. 调用Derived2的构造方法。 所以第一个先调用Base2()使value变成10,又调用Derived2()使value编程30
调试后发现
第一段代码父类构造调用的是本类的静态方法addValue()
i+=10;
子类构造调用的是自己的静态方法addValue()
i+=20;
=30第二段代码父类构造调用的是重写后子类的addValue()方法。
i+=20;
子类构造调用的是自己的方法addValue()
i+=20;
=40借地方问一下重写后的静态方法为什么是这样调用的?
所以每一个类的addValue都是自己的按照Base2的构造方法按照从最高到最低的顺序被调用。每个构造函数调用的addValue()方法,都是属于自己的类本身的
不存在重写的关系
所以代码一中,Base2 b = new Derived2();父类的构造函数调用的就是他本身的的addValue()方法,value=10;
代码二中,Base2 b = new Derived2(),由于子类重写了addValue()方法,所以父类的构造函数调用的就是子类的
addValue()方法,value=20