版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuming226/article/details/85042713
前言
子类构造方法执行前默认先执行父类的无参构造方法。
一个类的初始化过程
成员变量进行初始化
(1)默认初始化。
(2)显示初始化。
(3)构造方法初始化。
案例演示
package duixiang;
class Fu {
public int num = 10;
public Fu() {
System.out.println("fu");
}
}
class Zi extends Fu {
public int num = 20;
public Zi() {
System.out.println("Zi");
}
public void show() {
int num = 30;
System.out.println(num);//30
System.out.println(this.num);//20
System.out.println(super.num);
}
}
public class ExtendsTest {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
执行结果如下:
初始化变量、代码块和构造方法的初始化顺序
package duixiang;
class Test1 {
Test1(){
System.out.println("Test1构造方法!");
}
}
public class DemoTest {
Test1 test1 = new Test1();
static {
System.out.println("static");
}
{
System.out.println("普通代码块");
}
DemoTest() {
System.out.println("DemoTest构造方法");
}
public static void main(String[] args) {
DemoTest demoTest = new DemoTest();
}
}
执行结果如下:
子父类的初始化(分层初始化)
先进行父类初始化,然后进行子类初始化。
虽然子类中构造方法默认有一个super(),初始化的时候,不是按照那个顺序进行的。而是按照分层初始化进行的,它仅仅表示要先初始化父类数据,再初始化子类数据。
package duixiang;
class DemoX {
DemoY dy = new DemoY();
DemoX() {
System.out.println("X");
}
}
class DemoY {
DemoY() {
System.out.println("Y");
}
}
public class DemoZ extends DemoX{
DemoY dy = new DemoY();
DemoZ() {
System.out.println("Z");
}
public static void main(String[] args) {
new DemoZ();
}
}
执行结果如下:
对其编译后产生的class文件用反编译软件查看,其代码如下:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: DemoZ.java
package duixiang;
import java.io.PrintStream;
// Referenced classes of package duixiang:
// DemoX, DemoY
public class DemoZ extends DemoX
{
DemoY dy;
DemoZ()
{
dy = new DemoY();
System.out.println("Z");
}
public static void main(String args[])
{
new DemoZ();
}
}