`
Anddy
  • 浏览: 198030 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

继承,构造器,初始化顺序

J# 
阅读更多
   期中考试考了这个 题目 :居然 是Thinking in Java 的一个 例子。。,,看看 例子的 前面 和 后面的,我才 发现:我就这个 例子 没 有 去看 ,感觉 真亏了 ,12分就这忽略中失去!!


class Insect {
  private int i = 9;
  protected int j;
  Insect() {
    print("i = " + i + ", j = " + j);
    j = 39;
  }
  private static int x1 =
    printInit("static Insect.x1 initialized");
  static int printInit(String s) {
    print(s);
    return 47;
  }
}

public class Beetle extends Insect {
  private int k = printInit("Beetle.k initialized");
  public Beetle() {
    print("k = " + k);
    print("j = " + j);
  }
  private static int x2 =
    printInit("static Beetle.x2 initialized");
  public static void main(String[] args) {
    print("Beetle constructor");
    Beetle b = new Beetle();
  }
} /* Output:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
*///:~

终结一下:
  • 程序怎么进行的 ?在Beetle上运行java 时,所发生的第一件事就是试图访问Beetle.main()(一个static方法),于是加载器开始启动并找出Beetle类的编译代码,
  • 编译器注意到它有个基类(注意这是由extends引起的),于是加载基类,直到无基类。
  • 接下,从跟基类开始初始化static,直到最下面的导出类。why 从跟基类到导出类,
  • 因为导出类的static初始化可能会以来与基类成员能否正确的初始化。
    到这,必要的类加载完,可以开始创建对象了。
  • 开始初始化对象,首先对象中的所有基本类型都会被设为默认值,对象的引用设为null(通过将对象内存设为二进制零值而一举生成)。
  • 然后基类的构造器的调用(为什么开始就 调用基类?在导出类中必须确定基类中所有成员都是有效的)



构造器初始化的顺序学习:

class Meal {
  Meal() { print("Meal()"); }
}

class Bread {
  Bread() { print("Bread()"); }
}

class Cheese {
  Cheese() { print("Cheese()"); }
}

class Lettuce {
  Lettuce() { print("Lettuce()"); }
}

class Lunch extends Meal {
  Lunch() { print("Lunch()"); }
}

class PortableLunch extends Lunch {
  PortableLunch() { print("PortableLunch()");}
}

public class Sandwich extends PortableLunch {
  private Bread b = new Bread();
  private Cheese c = new Cheese();
  private Lettuce l = new Lettuce();
  public Sandwich() { print("Sandwich()"); }
  public static void main(String[] args) {
    new Sandwich();
  }
} /* Output:
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()
*///:~

总结调用顺序1:

//   1.调用基类的构造器,首先是跟基类,然后是下一层导出类,直到(基类中)最底层的导出类
//  2.俺声明顺序调用成员的初始化方法。
// 3.调用导出类构造器的主体。

修改上面代码段 :对class Lunch 修改如下:

class Lunch extends Meal {
	public int initialA() {
		print("A is initialized");
		return 1;
	}

	int A = initialA();
	Meal a = new Meal();

	Lunch() {
		print("Lunch()");
	}

	Meal d = new Meal();
	// 似乎从上面加入的代码可以看出,在加载构造器时,
        //先按顺序调用成员的初始化方法。再调用构造器的主体。
}


进一步总结调用顺序2:
//   1.调用基类的构造器,首先是跟基类,然后是下一层导出类,直到(基类中)最底层的导出类。

//  2.俺声明顺序调用成员的初始化方法。

// 3.调用导出类构造器的主体。

// 说明 :第二和第三步同样的适用(于第一步中)基类的构造器的调用。



分享到:
评论

相关推荐

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    java程序初始化顺序

    以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...

    java面试题-类的初始化顺序.doc

    这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...

    JAVA面试题解惑系列——类的初始化顺序

    只有在子类的静态成员初始化完成后,才开始父类的非静态成员和构造器的初始化,以及子类的构造器初始化。 这个顺序可能会导致一些有趣的现象,例如,在父类的构造器中使用某个还未初始化的子类静态成员变量(如果...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    JAVA类的初始化顺序文.pdf

    子类 --构造器 这个输出揭示了在继承关系中类的初始化顺序: 1. **静态成员和静态初始化块**:首先,会按照父类到子类的顺序初始化静态变量和执行静态初始化块。在上面的例子中,"父类 --静态变量" 和 "子类 --静态...

    探究java的ClassLoader及类变量初始化顺序

    同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    在 JAVA 中,类的初始化顺序可以分为四个阶段:静态变量、静态初始化块、变量、初始化块和构造器。其中,静态变量和静态初始化块的初始化顺序是最高的,接着是变量和初始化块,最后是构造器。 在了解类的初始化顺序...

    JAVA面试题解惑系列类的初始化顺序JAVA程序员JAVA工程师面试必看.pdf

    Java语言中的类初始化顺序是面试中...在实际编程中,我们有时需要依赖这种初始化顺序来确保数据的正确初始化,特别是在处理复杂的继承结构和多线程场景时。因此,熟练掌握类初始化顺序是每个Java程序员的基础技能之一。

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    本文将深入探讨Java中类的初始化顺序,特别是在有继承关系的情况下,各个初始化阶段的执行流程,以及这一顺序的重要性。 首先,让我们明确类初始化的含义。在Java中,类的初始化主要涉及以下三个阶段: 1. 静态...

    java类中元素初始化顺序详解

    Java 类的初始化顺序是一个关键的编程概念,尤其对于理解和避免潜在的运行时错误至关重要。在 Java 中,类的元素初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**: 首先,Java 解释器会执行类中的静态...

    c#构造初始化的顺序浅析

    在C#编程语言中,构造...总结起来,C#构造初始化的顺序是:子类字段初始化 -> 父类字段初始化 -> 父类构造器 -> 子类构造器。理解这个顺序可以帮助开发者更有效地设计和调试代码,确保对象在创建时始终处于正确状态。

    详解Java的初始化与清理

    本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即内存的自动清理。 首先,让我们详细了解一下Java中的构造器初始化。构造器是Java中用于初始...

    Java中对象初始化顺序的详细介绍

    这种情况下,初始化顺序如下:首先,`Lower`类的实例创建并分配默认值,然后调用`Upper`的构造器,接着执行`Initializer.initialize()`,该方法根据对象的实际类型(`Lower`)来设置字段的值。 5. **默认值**:即使...

    java父类和子类初始化顺序的深入理解

    在Java编程语言中,类之间的继承关系涉及到一个重要的概念——初始化顺序。当创建一个子类对象时,不仅子类的实例变量会被初始化,其父类的实例变量也会按一定的顺序进行初始化。理解这个顺序对于编写复杂的多层继承...

    java学习之神奇初始化

    2. **父类的构造器**:如果当前类继承自其他类,则父类的构造器会在子类构造器之前调用。 3. **实例变量的默认值**:如果没有为实例变量指定初始值,它们将被赋予默认值(例如,`int` 类型的默认值是 0)。 4. **...

    javase子类父类继承关系图解

    Java成员初始化顺序对于理解和正确使用继承至关重要。当创建一个子类对象时,其内存加载顺序遵循以下规则: 1. **静态初始化块**:首先执行的是类中的静态初始化块,无论类被实例化多少次,静态初始化块只执行一次...

    Java类的初始化顺序知识点总结

    在继承关系中,子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前完成的。这是因为子类的静态变量和静态初始化块的初始化发生在类加载时,而父类的变量、初始化块和构造器的初始化...

    java 继承关系的加载顺序

    总结,Java中继承关系的加载顺序遵循“先父后子”的原则,从加载到初始化,都是先处理父类,再处理子类。理解这一顺序对于理解和优化代码、避免潜在问题至关重要。同时,Java的类加载机制还支持动态加载和灵活的代码...

    再次详细说明在继承中的程序执行顺序,子类与父类到底哪个先执行

    综上所述,程序执行顺序的基本原则是:首先初始化并执行父类的构造器、静态和实例初始化块,然后执行子类的构造器、实例初始化块。最后,当通过子类对象调用方法时,优先执行子类覆盖的方法。理解这一顺序对于编写可...

Global site tag (gtag.js) - Google Analytics