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调用
    }
}

你可能感兴趣的:(java,开发语言,jvm)