`

java对象的构造顺序(珠海20090326)

阅读更多
package com.constructor.test;

class Parent {
	int pm1;
	int pm2 = 100;
	int pm3 = pmethod();
	{
		System.out.println("Parent's instance initialize block");
	}
	public static int spm1 = 200;
	public static int spmethod = spmethod();
	static {
		System.out.println("Parent's static initialize block");
	}

	Parent() {
		System.out.println("Parent's default constructor");
	}

	Parent(int i,int j)
	{
		//无用this();就不会调用默认的构造器
		System.out.println("two 参数的parent构造器");
	}
	
	static void staticmethod() {
		System.out.println("Parent's staticmethod");
	}

	int pmethod() {
		System.out.println("Parent's method");
		return 3;
	}
	static int spmethod()
	{
		System.out.println("parent's static field and static method give it the value");
		return 88;
	}
}

class Child extends Parent {
	int cm1;
	int cm2 = 1000;
	int cm3 = cmethod();
	Other co;
	static Other co2;
	public static int cmethod = scmethod();
	public static int scm1 = 2000;
	{
		System.out.println("Child's instance initialize block");
	}
	static {
		co2 = new Other();
		cmethod2(); // 要static的方法才行
		System.out.println("Child's static initialize block");
	}
	{
		System.out.println("Child's instance initialize block 2222");
	}

	Child() {
		co = new Other();
		System.out.println("Child's default constructor");
	}

	Child(int m) {
		this();   //如果无this就不会调会默认的构造器Child()
		cm1 = m;
		System.out.println("Child's self-define constructor");
	}

	static void staticmethod() {
		System.out.println("Child's staticmethod");
	}

	int cmethod() {
		System.out.println("Child's method");
		return 3;
	}

	static void cmethod2() {
		System.out.println("Child's method2!!!");
	}
	static int scmethod()
	{
		System.out.println("child's static field and static method give it the value");
		return 888;
	}

}

class Other {
	int om1;

	Other() {
		System.out.println("Other's default constructor");
	}

}

public class TestConstructor {
	public static void main(String args[]) {
		Child c;
		System.out.println("program start");
		System.out.println("Child.scm1=" + Child.scm1);
		// System.out.println("c.cm3="+c.pm2); pm2还未被初始化!
		c = new Child(10);
		System.out.println("program end");
		System.out.println();
		System.out.println("second instance begin");
		Child d = new Child(20);
		System.out.println("sencond instance end");
		//Child e = new Child(10,12); //没有声明Child(int,int)的构构器,不能通过编译
		Parent e = new Parent(10,12);
		
	}
}


program start
parent's static field and static method give it the value
Parent's static initialize block
child's static field and static method give it the value
Other's default constructor
Child's method2!!!
Child's static initialize block
Child.scm1=2000
Parent's method
Parent's instance initialize block
Parent's default constructor
Child's method
Child's instance initialize block
Child's instance initialize block 2222
Other's default constructor
Child's default constructor
Child's self-define constructor
program end

second instance begin
Parent's method
Parent's instance initialize block
Parent's default constructor
Child's method
Child's instance initialize block
Child's instance initialize block 2222
Other's default constructor
Child's default constructor
Child's self-define constructor
sencond instance end
Parent's method
Parent's instance initialize block
two 参数的parent构造器


从代码可以看到,对象的构造分为类的构造实例的构造两部分.
类的构造是在类的静态属性,方法调用之前完成的.System.out.println("Child.scm1=" + Child.scm1);之前就会完成类的静态属性和方法和块.
实例的构造是在new 构造方法时开始做的,Child d = new Child(20);.

构造的详细顺序如下:

类构造 (只做一次的,不论你new了多少个对象)

1.父类的static 属性(field)
2.父类的static块(block)
3.子类的static field
4.子类的static block

实例构造 (new一次做一次)

1.实例父类的field (非static)
2.实例父类的初始化block (非static,是用{}括起来的那些)
3.实例父类的默认构造器 (默认构造器是类名()这个)
4.实例子类(这个类)的field
5.实例子类(这个类)的初始化block
6.实例子类(这个类)的默认构造器 /no 应该是new的那一个构造器,见Parent e = new Parent(10,12);

(1)属性的构造顺序是按顺序的,先出现先构造.
(2)块的构造顺序是也是按顺序的,先出现先构造.
(3)如果块中,或方法中有new X类();的,就会调用X类的构造器.
(4)final不能用来声明构造方法.

分享到:
评论

相关推荐

    java_构造者模式

    在Java中,构造者模式通过隔离实例化过程和对象的构建过程,使得创建对象的过程更加灵活,同时也提高了代码的可读性和可维护性。下面我们将深入探讨这个模式的概念、结构以及如何在Java中实现。 1. **模式概念** ...

    “礼让”原则学习Java对象初始化顺序.pdf

    "Java 对象初始化顺序学习指南" 在学习 Java 编程语言时,对象初始化顺序是一个非常重要的知识点,但是许多学生却感到困惑和困难。事实上,Java 对象初始化顺序并不难理解,只需要掌握“礼让”原则和 JVM 的执行...

    java私有构造函数

    在Java编程语言中,构造函数(Constructor)是用于初始化新创建的对象的关键组成部分。默认情况下,构造函数的访问级别设置为`public`,以便其他类能够通过这个构造函数实例化对象。然而,在某些特定场景下,将构造...

    java 按顺序读取文件

    在Java编程语言中,按顺序读取文件是基础且重要的操作。这通常涉及到使用I/O流(Input/Output Stream)来处理文件数据。本篇文章将深入探讨如何在Java中实现按顺序读取文件,以及涉及的相关知识点。 首先,Java提供...

    java 构造器的调用

    在Java编程语言中,构造器(Constructor)是一个特殊的方法,主要负责对象的初始化工作。当创建一个新的类实例时,构造器会被自动调用。构造器的名称必须与类名完全相同,且没有返回类型,包括void。理解并熟练运用...

    java面试题静态加载顺序构造方法

    java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); static{ System.out.println("tttt"); } X(){ System....

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    8.java构造函数.zip

    8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8....

    java 子类构造方法

    在Java编程语言中,子类继承父类时,构造方法起着至关重要的作用。它们用于初始化对象,并在创建新实例时执行特定的设置步骤。理解如何在子类中使用构造方法是掌握面向对象编程的关键部分。本文将深入探讨Java子类...

    JAVA面向对象程序设计(期末考试试题及答案)

    4. Java 中的控制结构:顺序控制结构、选择控制结构、循环控制结构等。 二、面向对象编程概念 1. 面向对象编程的基本概念:封装、继承、多态等。 2. 类和对象的定义:类的定义、对象的创建、类的继承等。 3. 方法...

    Java入门理解构造器

    - **静态构造器不存在**:Java中没有静态构造器的概念,所有构造器都用于创建对象实例。 #### 七、示例代码解析 在提供的部分代码中,可以看到如下示例: ```java public class Platypus extends Mammal { String...

    Java中对象的生命周期 ..doc

    ### Java中对象的生命周期 #### 一、对象的生命周期概览 在Java中,对象的生命周期是指从对象被创建到最终被垃圾回收器回收这段时间。理解对象的生命周期对于有效地管理和优化Java应用程序至关重要。 #### 二、...

    JAVA类与对象及数组习题

    下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: 构造方法是类的特殊方法,用于初始化对象的状态。调用构造方法的方式有很多...

    Java 对象属性map排序示例

    本示例将详细介绍如何对Java对象属性Map进行排序。 首先,了解Map的基本类型。Java提供了HashMap、TreeMap等实现Map接口的类。HashMap是非排序的,而TreeMap是基于红黑树数据结构,会按照键的自然顺序或者自定义...

    9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf

    - 默认构造方法:如果没有显式定义任何构造方法,Java编译器将自动提供一个默认构造方法。 - 显式构造方法:可以通过定义一个或多个构造方法来自定义对象的初始化方式。 ```java public class Student { private ...

    构造方法JAVA构造方法

    Java构造方法是面向对象编程中的一个关键概念,用于初始化新创建的对象。在Java类中,构造方法是一个特殊的方法,它的名字必须与类名完全相同,没有返回类型,甚至不包括void关键字。当我们创建一个类的新实例时,...

    Java面向对象程序设计耿祥义版课件

    2. 构造器:构造器用于初始化新创建的对象,Java中的构造器与类同名且无返回值。 3. 访问控制修饰符:private、default(包访问)、protected和public,分别限制了类成员的访问范围。 4. 方法重载与覆盖:重载在同一...

    83.java中String构造方法.zip

    83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中...

    Java面向对象程序设计(第二版)

    在Java中,当类的对象被创建时,构造方法自动执行。构造方法与类同名,没有返回类型,也不存在返回值。如果程序员没有为类编写构造方法,Java会提供一个默认的构造方法。 6. 抽象类和接口 抽象类是不能实例化的类,...

    JAVA面向对象程序设计(期末考试试题及答案).zip

    在Java编程语言中,面向对象程序设计(Object-Oriented Programming, OOP)是一种核心的编程范式,它基于“对象”概念,将数据和处理数据的方法封装在一起,以实现代码的模块化和可重用性。这个压缩包文件"JAVA面向...

Global site tag (gtag.js) - Google Analytics