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

来源:互联网 发布:js 判断对象是否存在 编辑:程序博客网 时间:2024/05/16 05:02

  • 父类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)会被视为同一函数,但是不允许一个静态的 和非静态的同时存在,一个用类名、一个用实例变量,即使能调用,也失去了多态覆盖的意义;

阅读全文
0 0
原创粉丝点击