java多态,继承特性(子类和父类中的方法调用顺序)

父类

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相加,且在调用方法的过程中,取变量总是在类中就近取得。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值