`
kim_miao
  • 浏览: 190655 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中新建对象的初始化顺序

    博客分类:
  • Java
阅读更多
Java中新建对象的初始化顺序自以为很清楚了,但做了几个小题后,发现自己错了,索性自己也梳理下.

一.对于没有静态变量或静态代码段的类
1.其初始化顺序
    (1)先初始化父类的实例变量,再调用父类的构造函数。
    (2)再初始化子类的实例变量,再调用子类的构造函数完成初始化。
    (3)子类成员变量初始化是在父类构造函数调用完后,在此之前,成员变量的值均是默认值,这里的默认值为根据实例变量的类型对应不同的默认值(包括primitive类型,int=0,boolean=false,…)和(Reference类型)。
     
2.附代码段
   
public class A extends B {
		protected int a = 100;
		public A() {
			super();
			System.out.println(a);
			a = 200;
		}
	
		public static void main(String[] args) {
			System.out.println(new A().a);
		}
	}
	
	class B {
	
		public B() {
			System.out.println(((A) this).a);
		}
	}
    
执行结果是:
0
100
200

二.对于不存在继承关系的类
  1. 如果类中存在静态代码段和普通代码段,其初如化顺序如下:
    (1)先初始化静态成员或静态代码段,如果有多个,按先后出现的顺序执行.
    (2)再初始化普通代码段,如果有多个,按先后出现的顺序执行.
    (3)再初始化类中实例变量
    (4)最后调用构造函数完成初始化.

  2.附代码段
    
public class Person {
		private static String name;
		private int age = 10;
		private String description = "description:super class Person";
	
		{
			System.out.println("super class common code segment, age before:" + this.age);
			System.out
					.println("super class common code segment,description before:" + this.description);
		}
	
		static {
			name = "name:super class static code segment";
			System.out.println(name);
		}
	
		public Person(int age, String description) {
			this.age = age;
			this.description = description;
			System.out.println("super class age after:" + this.age);
			System.out.println("super class description after:" + this.description);
		}
	
		public static void main(String[] args) {
			new Person(20, "test");
			}
	}

执行结果如下:
name:super class static code segment
super class common code segment, age before:10
super class common code segment,description before:description:super class Person
super class age after:20
super class description after:test

三.对于存在继承关系的类
1. 如果类中存在静态代码段和普通代码段,其初如化顺序如下:
      (1)先初始化父类中的静态成员或静态代码段,如果有多个,按先后出现的顺序执行.
      (2)再初始化子类中的静态成员或静态代码段,如果有多个,按先后出现的顺序执行.

      (3)再初始化父类中的普通代码段,
      (4)再初始化父类中的实例变量和构造函数.
    
      (3)再初始化子类中的普通代码段
      (4)再初始化子类中的实例变量和构造函数.

2.附代码段
public class Student extends Person {
	
		private static String name;
	
		private int age = 20;
		private String description = "description:super class Student";
	
		{
			System.out.println("sub class common code segment, age before:"
					+ this.age);
			System.out.println("sub class common code segment ,description before:"
					+ this.description);
		}
	
		static {
			name = "name:sub class static code segment";
			System.out.println(name);
		}
	
		public Student(int age, String description) {
			super(age, description);
			this.age = age;
			this.description = description;
			System.out.println("sub class age after:" + this.age);
			System.out.println("sub class description after:" + this.description);
		}
	
		public static void main(String[] args) {
			new Student(30, "test");
		}

	}

执行结果如下:
name:super class static code segment
name:sub class static code segment
super class common code segment, age before:10
super class common code segment,description before:description:super class Person
super class age after:30
super class description after:test
sub class common code segment, age before:20
sub class common code segment ,description before:description:super class Student
sub class age after:30
sub class description after:test




3
0
分享到:
评论

相关推荐

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    详解Spring 中如何控制2个bean中的初始化顺序

    Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...

    java程序初始化顺序

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

    java代码的初始化顺序demo

    让我们深入探讨Java中的初始化顺序及其背后的机制。 1. **类加载阶段**: 在Java程序运行时,JVM会先加载类的字节码文件(.class文件)。这个过程包括加载、验证、准备、解析和初始化五个步骤。这里我们主要关注...

    Java类继承初始化顺序

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

    Java静态初始化块和对象初始化块

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

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

    在实际开发中,理解这个初始化顺序是非常重要的,尤其是在设计复杂的类结构或者涉及单例模式、线程安全初始化等场景时。如果在构造器或初始化块中依赖其他静态或非静态成员,必须确保这些成员在需要之前已经被正确...

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

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

    类继承的初始化顺序类,继承的初始化顺序

    在面向对象语言中(如Java、C#等),当创建一个继承自某个基类的子类对象时,会有一个特定的初始化顺序。这个顺序通常遵循以下步骤: 1. **基类静态成员初始化**:如果基类中有任何静态成员,则会在程序启动时按照...

    Java初始化顺序1

    Java 中的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 Java 初始化顺序的知识点总结: * 类变量(静态变量)和实例变量(对象变量)的区别 * ...

    java对象的初始化顺序[参考].pdf

    Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...

    对象初始化流程梳理对象初始化流程梳理

    Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...

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

    Java中,类变量(static变量)的初始化顺序遵循以下规则: 1. 首先,执行父类的静态初始化块(方法),如果有的话。 2. 然后,执行子类的静态初始化块。 3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

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

    在Java中,类的初始化顺序是一个经常被问及的面试题目,尤其对于Java程序员和工程师来说,了解这个知识点是必须的。在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面...

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

    在 Java 中,类的元素初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**: 首先,Java 解释器会执行类中的静态变量初始化和静态初始化块。这些静态元素的初始化只会在类加载时执行一次,并且按照它们在源...

    JAVA类的初始化顺序文.pdf

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

    Java初始化块Java初始化块.doc

    Java 初始化块,也称为构造代码块,是Java编程语言中的一种特性,用于在对象创建时执行特定的初始化操作。初始化块在类的定义中以 `{}` 包裹的一段代码,没有返回值,也不需要任何参数。根据是否带有 `static` ...

    java对象初始化顺序验证示例

    Java对象初始化顺序是一个重要的编程概念,它涉及到类的继承、构造函数、成员变量初始化和非静态初始化块。在这个示例中,我们通过一个简单的代码片段来验证这些规则。首先,让我们详细解析一下给出的代码: ```...

    学习java静态数据初始化.doc

    在 Java 中,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。如果一个静态变量依赖于另一个静态变量的值,那么这两个变量的初始化顺序是重要的。 在给定的代码中,我们可以看到有多个静态变量的声明和初始...

Global site tag (gtag.js) - Google Analytics