Java父类与子类 构造函数,实例函数,类函数的调用顺序

一,构造函数的调用顺序

java中子类的构造函数必须首先调用父类的构造函数,如果子类的构造函数没有显示的调用父类的构造函数,编译器回自动的在子类的构造函数的第一排调用父类的无参构造函数,如果父类没有无参构造函数,子类必须显示调用父类的其他构造函数,否则将报错

public class Parent {
    public Parent(){}
}

public class Child extends Parent {
    public Child(){
        super();//显示调用父类构造方法,不写编译器也会自动加上
    };
}

由于父类的构造函数被放在第一排,所以父类构造函数执行完之后子类的构造函数才会被执行,所以构造函数的执行顺序是,先父类后子类;

java中的就地初始化,也就是成员变量直接在定义的时候赋值,这个赋值操作也会被编译器自动添加到构造函数的第一排,构造函数执行时,先执行就地初始化的赋值,此时如果构造函数是子类对象调用,父类的构造函数super()也要调用,也会被放在子类构造函数代码的第一排,在就地初始化赋值之前,但是super()放在实际的第一排,就地初始化的语句将放在第二排;

下列代码的打印顺序就是YXYZ

class Y{
    public Y(){
        //y的构造函数
        System.out.print("Y");
    }
}
class X{
    Y y=new Y();//就地初始化 y
    public X(){
        //默认在第一行初始化y,调用y的构造函数
        System.out.print("X");
    }
}

public class Z extends X{
    Y y=new Y();
    public Z(){
    //先调用super();
    //再就地初始化y,调用y的构造函数
    System.out.print("Z");
}
public class Main{
    public static void main(String[] args) {
        new Z();
    }
}

二 子类方法如何调用父类方法

(1)如果父类的方法没有在子类中重写,那么父类的方法就能在子类方法中直接使用名字调用

public class Parent {
    public void methodA() {
        System.out.println("Parent's methodA");
    }
}

public class Child extends Parent {
    public void methodB() {
        System.out.println("Child's methodB");
    }

    public void callMethodA() {
        methodA(); // 直接调用父类的方法
    }
}

(2)如果父类方法在子类中被重写了,那么此时要调用被重写之前的父类方法,需要使用super关键字,使用名字直接调用只能调用到子类重写后的方法

public class Parent {
    public void method() {
        System.out.println("父类方法");
    }
}

public class Child extends Parent {
    public void method() {
        super.method(); // 调用父类方法
        System.out.println("子类方法");
    }
}

值得一提的是,重写的子类方法的权限必须要大于或者等于父类方法的权限

public>default>protected>private

(3)父类的类方法不能在子类中直接调用,需要使用父类类名或者super来调用

public class Parent {
    public static void classMethod() {
        System.out.println("Parent's class method.");
    }
}

public class Child extends Parent {
    public void instanceMethod() {
        Parent.classMethod(); // 使用父类名称调用父类的类方法
        super.classMethod();//通过super调用
    }
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值