`

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私有构造函数

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

    java 按顺序读取文件

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

    java 构造器的调用

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

    讲解Java中如何构造内部类对象以及访问对象

    总之,理解如何构造和访问Java中的内部类对象对于深入学习Java面向对象编程至关重要。反射提供了一种动态访问类和其成员的能力,包括构造器,这对于测试、框架开发和其他需要在运行时操作类的场景非常有用。然而,...

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

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

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

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

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

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

    JAVA类与对象及数组习题

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

    对象和构造器

    在 Java 程序设计中,对象和构造器是两个基本概念。对象是类的实例,构造器是创建对象的特殊方法。 类和对象 在 Java 中,每个对象都是一个类的实例。类是对对象的抽象,定义了对象的属性和行为。类中定义的变量...

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

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

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

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

    漫画面向对象编程 Java

    借助于漫画展示的形式,面向对象的简、由类创建一个对象的方法、类的编写与对象的创建、类的构造函数、类的方法、修饰符、Java中的封装/继承/多态等特征、Java中的线程、用Java创建一个小世界、多线程共享数据,以及...

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

    本文将深入探讨Java中对象初始化的顺序,帮助开发者理解这一过程的细节。 首先,Java类的加载过程分为三个阶段:装载、链接和初始化。装载是将类的.class文件读入内存,并为之创建一个Class对象。链接则是将类的二...

    面向对象经典讲解 有助于更进一步理解java对象

    - `this`关键字在Java中代表当前对象的引用,常用于区分成员变量和局部变量,以及在构造方法中调用其他构造方法。 **方法的数据类型传递**: - Java中的方法调用可以传值或传引用。基本类型数据是按值传递,而对象...

    java面向对象教程(PPT)

    Java面向对象编程是一种核心的编程范式,是Java语言的核心特性。这个教程,由著名讲师叶莉讲解,通过PPT的形式,旨在帮助学习者深入理解并掌握这一关键技能。下面,我们将详细探讨Java面向对象的一些关键知识点。 1...

    MLDN魔乐JAVA_05构造方法、匿名对象.rar

    在Java编程语言中,构造方法和匿名对象是两个非常重要的概念,它们对于理解和创建对象起着关键作用。本文将深入探讨这两个主题,并结合实例进行详细解释。 首先,我们来看构造方法。构造方法是一种特殊的方法,它与...

    json转对象数组与对象数组转json --Java

    ### JSON转对象数组与对象数组转JSON(Java) 在Java编程语言中,处理JSON数据时经常需要进行JSON字符串与Java对象之间的转换。特别是在涉及到数组或集合的场景下,这种转换显得尤为重要。本文将详细介绍如何使用...

    Java面向对象程序设计 例子源代码

    Java面向对象程序设计是计算机科学中的一个重要领域,它基于面向对象编程(OOP)的理念,强调将现实世界的问题抽象为类和对象,从而更高效、更直观地进行软件开发。这个压缩包包含了一系列的Java源代码示例,由...

Global site tag (gtag.js) - Google Analytics