Thinking in Java之衍生类和基础类的初始化顺序

《Thinking in Java》书里的例子,我又稍微修改了下代码:

class Real{
    public Real(String index) {
        // TODO Auto-generated constructor stub
        System.out.println("Real()"+index);
    }
}
class Meal{
    Real r= new Real("Meal");
    Meal() {
        // TODO Auto-generated constructor stub
        System.out.println("Meal()");
    }
}
class Bread{
    Bread() {
        // TODO Auto-generated constructor stub
        System.out.println("Bread()");
    }
}
class Cheese{
    Cheese() {
        System.out.println("Cheese()");
    }
}
class Lettuce{
    Lettuce() {
        // TODO Auto-generated constructor stub
        System.err.println("Lettuce()");
    }
}
class Lunch extends Meal{
    Real r= new Real("Lunch");
    Lunch(){
        System.out.println("Lunch()");
    }
}
class PortableLunch extends Lunch{
    Real r= new Real("PortableLunch");
    PortableLunch(){
        System.out.println("PortableLunch()");
    }
}
public class Sandwich extends PortableLunch{
    Bread b= new Bread();
    Cheese c= new Cheese();
    Lettuce l= new Lettuce();
    Sandwich(){
        System.out.println("Sandwich()");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Sandwich();
    }

}

output:

Real()Meal
Meal()
Real()Lunch
Lunch()
Real()PortableLunch
PortableLunch()
Bread()
Cheese()

Lettuce()
Sandwich()

总结:

如果衍生类和基础类都没有static成员,创建衍生类,初始化顺序:一直向上,从根类开始,初始化根类成员,然后根类构造器;然后向下,次根类成员,次根类构造器,以此类推,一直到衍生类本身。

时间: 2024-08-08 20:32:38

Thinking in Java之衍生类和基础类的初始化顺序的相关文章

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺

class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法.子类也是这样,然后继承之后,关于程序打印输出的结果.涉及到Java类的各种成员的初始化顺序.经测试,得到如下结论: 1.父类[静态成员]和[静态代码块],按在代码中出现的顺序依次执行.2.子类[静态成员]和[静态代码块],按在代码中出现的顺序依次执行.3.父类的[普通成员变量被普通成员方法赋值]和[普通代码块],按在代码中出现的顺序依次执行.4.执行父类的构造方法

浅谈java类中成员的初始化顺序(一)

类被创建之后的成员的初始化顺序到底是怎么样的? 首先 不考虑继承 package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 private static int a=1; private String str="我被赋值了"; static{ //为什么static成员函数不能访问非static变量, 不能调用非static成员函数? //静态代码块独立于对象而存在 不依赖于对象存在 简单来说可以直接以类型名

Java类、实例的初始化顺序

题目: public class InitTest{ public static int k = 0; public static InitTest t1 = new InitTest("t1"); public static InitTest t2 = new InitTest("t2"); public static int i = print("i"); public static int n = 99; public int j = pr

3.Java继承中父类与子类的初始化顺序

在 Java 编程语言中,对象的初始化是非常结构化的,这样做是为了保证安全.在前面的模块中,看到了当一个特定对象被创建时发生了什么.由于继承性,对象被完成,而且下述行为按顺序发生: 存储空间被分配并初始化到 0 值 进行显式初始化 调用构造方法 层次中的每个类都会发生最后两个步骤,是从最上层开始. Java 技术安全模式要求在子类执行任何东西之前,描述父类的一个对象的各个方面都必须初始化.因此,Java 编程语言总是在执行子构造方法前调用父类构造方法的版本.有继承的类在运行的时候,一定要记得:初

java中一个类的成员变量初始化过程

Student s = new Student(); 1.加载Student.class文件进内存 2.在栈内存为s开辟空间 3.在堆内存为学生对象开辟空间 4.对学生对象的成员变量进行默认初始化 5.对学生对象的成员变量进行显示初始化 6.通过构造方法对学生对象的成员变量赋值 7.学生对象初始化完毕,把对象地址赋值给s变量 原文地址:https://blog.51cto.com/14651315/2464214

java 成员变量 静态成员变量 方法 静态方法初始化顺序

Java构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减): ① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次: ② 父类

类和对象的初始化顺序

父类 package com.day06; public class StaticDemo { //静态代码块 int num=3; static{ System.out.println("父类静态代码块 --A"); } //构造代码块 { System.out.println("父类构造代码块 ---A "+this.num); } public StaticDemo(){ System.out.println("父类构造方法---A");

8.JAVA编程思想类再生

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040239 "Java 引人注目的一项特性是代码的重复使用或者再生.但最具革命意义的是,除代码的复制和修改以外,我们还能做多得多的其他事情." 在象C 那样的程序化语言里,代码的重复使用早已可行,但效果不是特别显著.与Java 的其他地方一样,这个方案解决的也是与类有关的问题.我们通过创建新类来重复使用代码,但却用不着重新创建,可以直接使用别人已建好并调试好的现成

java 编程思想之7.2.1初始化基类

继承是所有OOP语言不可缺少的能成部分.但继承并不只是复制基类的接口.当创建一个导出类的对象时,该对象包含了一个基类的子对象.这个子对象与你用基类直接创建的对象是一样的.二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部. 对基类子对象的正确初始化顺序之前不能说不知道,好像所有知道点都一样,只是去看,就觉得自己掌握了,其实不是.那只是当时的自以为.呵呵,眼高手低.今天看到相关的章节,翻翻又是觉得都是自己知道的呀.也许是对同一个知识点有过太多次这种想,于是今天决定不只是看,不只是