父类
public class ModelA {
int x = 5;
int y = 2;
public ModelA(){
System.out.println("父类无参构造函数");
}
public ModelA(int a) {
x = a;
System.out.println("父类构造函数 x = " + x);
}
int getz() {
System.out.print("ModelA: x / y = ");
return x / y;
}
public void show() {
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("z = " + getz());
}
}
子类
public class ModelB extends ModelA{
int y = 2;
int x = 4;
int getz() {
System.out.print("ModelB: x + y = ");
return x + y;
}
}
测试类
public class extendsTest {
@Test
public void test(){
ModelA num1 = new ModelA(8);
ModelB num2 = new ModelB();
num1.show();
num2.show();
}
}
测试结果
父类构造函数 x = 8
父类无参构造函数
x = 8
y = 2
ModelA: x / y = z = 4
x = 5
y = 2
ModelB: x + y = z = 6
原因解释
- 第一行结果就是调用了父类的有参构造函数,输出了给赋给x的默认值
- 第二行在子类中不覆盖写构造函数的情况下,子类会有一个默认的无参构造函数,且这个函数中会调用父类的构造函数supe(),来获取父类的所有属性,且这个对父类构造函数的调用会发生在自己的构造函数调用之前
- 第三第四行,一个是赋予num1的值x,一个是类中的默认值y
- 第五行就是调用了父类自己的getz()方法并输出结果
需要注意的是,当子类调用方法时,每次子类都会在自己的类中去找这个方法, 如果找不到的话,就去父类中找。
- 第六第七行是因为子类中没有show()方法,所以就向上找父类的方法,所以输出的是父类设置的默认x与y。
- 第七行是因为当执行到getz的时候,程序还是默认先去子类总寻找有没有getz方法,找到了就调用子类的getz方法,否则再去父类找,这里由于子类中有父类方法,所以是对x,y相加,且在调用方法的过程中,取变量总是在类中就近取得。