Fork me on GitHub

Java编程思想———类的继承

继承语法

在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都别正确地初始化。

  • 子类的所有构造方法内部,第一行会(隐式)自动先调用父类的无参构造函数(super())
  • 如果子类构造方法第一行显式调用了父类构造方法,系统就不再调用父类的无参构造函数
  • 子类的构造方法中调用父类的构造函数必须写在第一行,如果父类没有无参构造函数,子类必须在构造方法中显式调用父类的有参构造函数

继承的初始化顺序

‼️ 初始化顺序:父类的静态变量(父类的静态代码块) --> 子类的静态变量(子类的静态代码快) --> 父类的非静态变量(父类的非静态代码块) --> 父类的构造函数 --> 子类的非静态变量(子类的非静态代码块)–> 子类的构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.hts.test;

public class Test {
public static void main(String[] args) {
Child c=new Child();
}
}
class Parent {
public static PrintMessage a=new PrintMessage("父类静态成员被初始化");
private PrintMessage b=new PrintMessage("父类非静态成员被初始化");
static{
System.out.println("父类的静态代码块被执行");
}
{
System.out.println("父类的非静态代码块被执行");
}
public Parent(){
System.out.println("父类的构造方法被执行");
}
}

class Child extends Parent{
public static PrintMessage a1=new PrintMessage("子类静态成员被初始化");
private PrintMessage b1=new PrintMessage("子类非静态成员被初始化");

static {
System.out.println("子类的静态代码块被执行");
}
{
System.out.println("子类的非静态代码块被执行");
}
public Child(){
System.out.println("子类的构造函数被执行");
}
}

class PrintMessage{
public PrintMessage(String mes){
System.out.println(mes);
}
}

output:
父类静态成员被初始化
父类的静态代码块被执行
子类静态成员被初始化
子类的静态代码块被执行
父类非静态成员被初始化
父类的非静态代码块被执行
父类的构造方法被执行
子类非静态成员被初始化
子类的非静态代码块被执行
子类的构造函数被执行
求鼓励,求支持!