JAVA基础:子类、父类继承关系 静态块、非静态块、构造函数初始化顺序性、静态非静态方法覆盖

  • 父类Parent;
  • 子类Child 继承Parent;
  • Test类测试;

Parent child = new Child();

class Parent{
    static {
        System.out.println("P-静态块");
    }
    {
        System.out.println("P-非静态块");
    }
    public Parent(){
        System.out.println("父类构造");
    }
    public void print(){
        System.out.println("父类函数Print");
    }

}
class Child extends Parent{
    static {
        System.out.println("Child-静态块");
    }
    {
        System.out.println("Child-非静态块");
    }
    public Child(){
        System.out.println("Child类构造");
    }
    public void print(){
        System.out.println("子类函数Print");
    }
}
public class Test{
    static {
        System.out.println("Test-静态块");
    }
    {
        System.out.println("Test-非静态块");
    }
    public Test(){
        System.out.println("Test类构造");
    }
    public static void main(String[] args) {
        Parent child =new Child();
        child.print();
    }

}
运行结果如下:

Test-静态块
P-静态块
Child-静态块
P-非静态块
父类构造
Child-非静态块
Child类构造
子类函数Print

由此可见:

静态块:

  • 优先级最高,永远被最先加载;
  • 静态块是类的属性,只要是涉及到的类,都会被立刻加载(Test,Parent,Child);
  • 而且只在类加载时加载一次,与类同生命周期。

非静态块:

构造函数:

  • 当调用构造函数时,会先调用自己类里面的非静态块;
  • 不初始化就不会调用,比如Test内的非静态块;
  • 每次调用构造函数,就会调用非静态块,可以调用多次
  • 适用于创建对象之前在非静态块前清理;

P-非静态块
父类构造
Child-非静态块
Child类构造

多态:类内多态;

  • Parent print()函数;
  • Child print()函数;

Parent child = new Child();

会调用子类方法,覆盖父类;

静态、非静态方法;

  • 实例方法覆盖实例方法;
  • 静态方法覆盖静态方法;
  • 不允许一个静态(static print)、一个非静态(print),会编译报错;

Error:(26, 18) java: Child中的print()无法覆盖Parent中的print()
  被覆盖的方法为static
重载按照方法签名(方法名+参数 与static无关)因而一个静态(static print)、一个非静态(print)会被视为同一函数,但是不允许一个静态的 和非静态的同时存在,一个用类名、一个用实例变量,即使能调用,也失去了多态覆盖的意义;

猜你喜欢

转载自blog.csdn.net/evanxuhe/article/details/78051337