`
kim_miao
  • 浏览: 188803 次
  • 性别: 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开发者文档,分享日常学习的一些小知识点 .rar

     未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化。  2、继承时,对象的初始化过程  (1) 主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。  (2) 主类静态...

    java顺序表的基本操作.docx

    在Java中,顺序表(Sequential List)是一种常见的线性数据结构,它以连续的...可以选择使用数组的静态初始化或动态初始化来创建顺序表。 可以定义一个变量来记录顺序表的大小,也可以直接使用数组的长度。 插入元素:

    Thinking in java4(中文高清版)-java的'圣经'

    5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...

    JAVA基础知识精华总结 收藏

    未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化。 2、 继承时,对象的初始化过程 (1) 主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。 (2) 主类静态成员的...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    【Java高频面试题】–类的初始化过程以及实例的初始化过程

    要创建一个类的实例,必须加载和初始化该类。 main()方法所在的类,会被优先加载并初始化 子类初始化前,会先加载并初始化它的父类 初始化一个类,其实质上就是执行了()方法 ()方法包含了,静态变量显式赋值代码以及...

    Thinking in Java简体中文(全)

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    java联想(中文)

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    初始化顺序 16 this 和 super 16 访问控制权限 16 继承 17 多态 17 代理 17 Static 17 Final 17 接⼝和抽象类 18 接⼝ 18 抽象类 18 异常 18 认识 Exception 18 什么是 Throwable 18 常⻅的 Exception 19 与 ...

    Thinking in Java 中文第四版+习题答案

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    Thinking in java(中文)

    一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 ...

    JAVA面试题解惑系列合集

    1.1 JAVA面试题解惑系列(一)——类的初始化顺序 1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象? 1.3 JAVA面试题解惑系列(三)——变量(属性)的覆盖 1.4 JAVA面试题解惑系列(四)——final、...

    java 编程入门思考

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    Java初学者入门教学

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例变量。对象声明的一般格式为: type name 其中,type 是一个类的类名,用它声明的对象将...

    JAVA_Thinking in Java

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    关于Java的几个经典问题

    1.类的初始化顺序 2.到底创建了几个String对象(三)——变量(属性)的覆盖 (四)——final、finally和finalize的区别 (五)——传了值还是传了引用(六)——字符串(String)杂谈 (七)——日期和时间的处理 ...

    Java面试题解惑系列

    来自网络,主要包括以下内容:1、类初始化的顺序;2、到底创建了几个String对象;3、变量(属性)的覆盖;4、final,finally,finalize;5.传了值还是传了引用;6.String杂谈;7.日期与时间的处理;8.基本类型总结;9....

Global site tag (gtag.js) - Google Analytics