Java子类继承父类,类的加载顺序,看着一篇就够了

版权声明:本文为HCG原创文章,未经博主允许不得转载。请联系[email protected] https://blog.csdn.net/qq_39455116/article/details/83377068

1. 代码

package parent;

public class Child extends Father {
    static {
        System.out.println("子类静态代码块无变量");
    }

    static int c = 6;

    static {
        c = c + 10;
        System.out.println("子类静态代码块,c=" + c);
    }

    public Child() {
        c = c + 100;
        System.out.println("子类构造函数c=" + c);
    }

    {
        c = c + 1000;
        System.out.println("子类构造代码块c=" + c);
    }

    @Override
    public void putong() {
        c = c + 500;
        System.out.println("子类重写父类的私有普通方法c=" + c);
    }


    public static void staticMethod() {
        c = c + 500;
        System.out.println("子类写一个和父类名字一样的静态方法c=" + c);
    }

    public static void main(String[] args) {
        Child child = new Child();
        child.putong();
        staticMethod();
    }
}

2. 结果

父类静态代码块无输出
父类静态代码块501
子类静态代码块无变量
子类静态代码块,c=16
父类构造代码块:a: 511
父类构造方法执行,a:611
子类构造代码块c=1016
子类构造函数c=1116
子类重写父类的私有普通方法c=1616
子类写一个和父类名字一样的静态方法c=2116

3. 结果分析

1. 若存在继承关系,而且父类和子类中都存在静态代码块、静态变量、构造代码块、构造方法
2. 先是父类静态代码块和静态变量,静态代码块和静态变量的初始化顺序 是谁在前谁先加载
3. 再是子类静态代码块和静态变量,静态代码块和静态变量的初始化顺序 是谁在前谁先加载
4. 再是父类构造代码块,父类构造方法
5. 再是子类构造代码块,父类构造方法

4. 继承父类方法引发的问题

1. 子类只能重写父类的普通而且是public方法,私有方法不能重写
2.重写的方法也只是再调用的时候才能执行
3.怎么判断子类是不是能重写父类的方法,用一个@Override即可判断,如果一个方法上不能加@Override说明不能重写
##### 4. 父类的静态方法可以被子类继承,但是不能重写,或者说不能叫重写,如果在子类上写一个和父类名字相同的静态方法,添加@Override就会报错,网上关于父类静态方法能不能被子类重写的讨论有很多,这里我摘抄一部分,下面展示

5. 讨论

1.静态方法属于静态绑定,在编译阶段已经确定函数名和地址,
静态方法当然是可以被继承的,但是却不能被重写,为什么那?
因为重写的意思是重新定义父类的虚函数,但是虚函数是动态绑定的,而静态方法是静态绑定的,
所以静态函数必然不能是虚函数,也就不存在所说的重写了.你在子类中重新写一个同名的函数,
覆盖了父类的同名函数,在使用子类指针进行调用的时候,调用的就是子类的这个静态方法
2.如果不是在这个父类也不是子类中,而是在另外一个类中调用的时候,是需要导入类的,
你导入的是什么类,他就会引入哪个类,进而调用父类或者子类的方法
import static parent.Child.staticMethod;
public class Ther {
    public static void main(String[] args) {
        staticMethod();//输出的是子类的结果
    }
}
import static parent.Father.staticMethod;

public class Ther {
    public static void main(String[] args) {
        staticMethod();//输出的是父类的结果
    }
}
3. 但是在一个父类或者子类的Main方法中,默认调用的是自己的,当前是父类,输出的就是父类的
当前是子类,输出的结果就是子类的






























猜你喜欢

转载自blog.csdn.net/qq_39455116/article/details/83377068