构造方法以及对象初始化过程
2009-06-20 16:35
567 查看
一、构造方法
构造方法特点如下:
1. 没有返回类型,方法名必须和类名一致
2.构造方法不能手动调用,它只用在创建对象的时候,只出现在new之后,只要构造方法被调用运行,就一定有对象产生
3.在一个对象的生命周期里,构造方法只能被调用一次
4.类写好后一定有构造方法,如果程序没有显示的提供构造方法,系统会提供一个默认的构造方法,public classname(){} ,如果程序显示提供,系统不再提供默认的
5.同一个类的多个构造方法一定是重载
6.构造方法的代码块里可以写创建对象的同时需要运行的代码还可以给属性赋值
7.构造方法不能被继承,因此不能Override,但它可以Overloading
二、没有父类的对象初始化过程(父类为Object除外)
1. 分配空间
2. 构造方法第一行是否有this()
3. 初始化实例变量
4. 执行构造方法
因为实例变量在创建对象的过程中被初始化,所以使用实例变量前必须创建对象,否则实例变量根本不存在在创建对象时,本类的构造方法永远最后执行
没有this()测试代码如下:
代码运行如下:
this is harddisk
this is computer
有this()测试代码如下:
代码运行如下:
Egg
Milk
this is no param constructor
this is have param constructor
5
三、有父类的对象初始化过程
1. 分配总内存(包括所有属性的内存,本类属性,父类的共性)
2. 看本类构造方法的第一句是否有this()或super()
3. 创建父类对象
4. 初始化本类的实例变量
5. 执行本类的构造方法
测试代码如下:
运行结果如下:
Egg
Meal
Milk
Breakfast
Egg
Milk
ChineseBreakfast have param
ChineseBreakfast no param
四、有静态变量、静态代码块的对象初始化过程
1. 父类的静态变量(常量)/静态代码块
2. 子类的
静态变量(常量)/静态代码块
3. 父类的变量/代码块
4. 父类的构造方法
5. 子类的变量/代码块
6. 子类的构造方法
静态变量/静态代码块、变量/代码块的初始化顺序以其在代码中出现的先后顺序为准,先出现先初始化。
测试如下:
运行结果如下:
Egg
super's static block
sub's static block
Fish
Milk
super's block
super's constructor
sub's block
Meat
sub's constructor
注意,这也是一道常见的面试题。 关于this、super的介绍见“this和super
”一文。
构造方法特点如下:
1. 没有返回类型,方法名必须和类名一致
2.构造方法不能手动调用,它只用在创建对象的时候,只出现在new之后,只要构造方法被调用运行,就一定有对象产生
3.在一个对象的生命周期里,构造方法只能被调用一次
4.类写好后一定有构造方法,如果程序没有显示的提供构造方法,系统会提供一个默认的构造方法,public classname(){} ,如果程序显示提供,系统不再提供默认的
5.同一个类的多个构造方法一定是重载
6.构造方法的代码块里可以写创建对象的同时需要运行的代码还可以给属性赋值
7.构造方法不能被继承,因此不能Override,但它可以Overloading
二、没有父类的对象初始化过程(父类为Object除外)
1. 分配空间
2. 构造方法第一行是否有this()
3. 初始化实例变量
4. 执行构造方法
因为实例变量在创建对象的过程中被初始化,所以使用实例变量前必须创建对象,否则实例变量根本不存在在创建对象时,本类的构造方法永远最后执行
没有this()测试代码如下:
]public class TestInitial1{ public static void main(String[] args){ Computer com = new Computer(); } } class Computer{ HardDisk hd = new HardDisk(); public Computer(){ System.out.println("this is computer"); } } class HardDisk{ public HardDisk(){ System.out.println("this is harddisk"); } }
代码运行如下:
this is harddisk
this is computer
有this()测试代码如下:
]public class TestInitial2{ public static void main(String[] args){ Breakfast bf = new Breakfast(3); System.out.println(bf.egg.number); } } class Breakfast{ Egg egg = new Egg(); Milk milk = new Milk(); public Breakfast(){ System.out.println("this is no param constructor"); } public Breakfast(int num){ this(); System.out.println("this is have param constructor"); } } class Egg{ int number=5; public Egg(){ System.out.println("Egg"); } } class Milk{ public Milk(){ System.out.println("Milk"); } }
代码运行如下:
Egg
Milk
this is no param constructor
this is have param constructor
5
三、有父类的对象初始化过程
1. 分配总内存(包括所有属性的内存,本类属性,父类的共性)
2. 看本类构造方法的第一句是否有this()或super()
3. 创建父类对象
4. 初始化本类的实例变量
5. 执行本类的构造方法
测试代码如下:
]public class TestInitial3{ public static void main(String[] args){ ChineseBreakfast cbf = new ChineseBreakfast(); } } class Meal{ private Egg egg = new Egg(); public Meal(){ System.out.println("Meal"); } } class Breakfast extends Meal{ private Milk milk = new Milk(); public Breakfast(){ System.out.println("Breakfast"); } } class ChineseBreakfast extends Breakfast{ private Egg egg = new Egg(); private Milk milk = new Milk(); public ChineseBreakfast(){ this(3); System.out.println("ChineseBreakfast no param"); } public ChineseBreakfast(int num){ System.out.println("ChineseBreakfast have param"); } } class Egg{ public Egg(){ System.out.println("Egg"); } } class Milk{ public Milk(){ System.out.println("Milk"); } } class A{ public A(){ System.out.println("A()"); } } class B extends A{ public B(){ System.out.println("B()"); } }
运行结果如下:
Egg
Meal
Milk
Breakfast
Egg
Milk
ChineseBreakfast have param
ChineseBreakfast no param
四、有静态变量、静态代码块的对象初始化过程
1. 父类的静态变量(常量)/静态代码块
2. 子类的
静态变量(常量)/静态代码块
3. 父类的变量/代码块
4. 父类的构造方法
5. 子类的变量/代码块
6. 子类的构造方法
静态变量/静态代码块、变量/代码块的初始化顺序以其在代码中出现的先后顺序为准,先出现先初始化。
测试如下:
]publc class TestInitial4{ public static void main(String[] args) throws Exception{ new Sub(); } } class Super{ private static final Egg egg = new Egg(); private Milk milk = new Milk(); static{ System.out.println("super's static block"); } { System.out.println("super's block"); } public Super(){ System.out.println("super's constructor"); } } class Sub extends Super{ static{ System.out.println("sub's static block"); } { System.out.println("sub's block"); } private static final Fish fish = new Fish(); private Meat meat = new Meat(); public Sub(){ System.out.println("sub's constructor"); } } class Egg{ public Egg(){ System.out.println("Egg"); } } class Milk{ public Milk(){ System.out.println("Milk"); } } class Fish{ public Fish(){ System.out.println("Fish"); } } class Meat{ public Meat(){ System.out.println("Meat"); } }
运行结果如下:
Egg
super's static block
sub's static block
Fish
Milk
super's block
super's constructor
sub's block
Meat
sub's constructor
注意,这也是一道常见的面试题。 关于this、super的介绍见“this和super
”一文。
相关文章推荐
- 黑马程序员--java中父类和子类都有构造方法时,子类对象的初始化过程
- 嵌入式软件开发培训笔记——Java第三天(方法重载、对象的构造与初始化过程分析、封装等)
- 图解Java对象初始化过程以及方法调用
- 对象的初始化、继承时,对象的初始化过程、关于构造方法、抽象类……
- 图解Java对象初始化过程以及方法调用
- 图解Java对象初始化过程以及方法调用
- 图解Java对象初始化过程以及方法调用
- 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)
- JavaSE_65_对象的构造方法以及初始化
- .ctor,.cctor 以及 对象的构造过程(上)
- 构造方法实现对象初始化
- JAVA静态代码块执行过程 以及和构造方法的区别
- Java静态初始化,实例初始化以及构造方法
- 代码块、构造方法在对象的初始化顺序
- c++高级---C++类构造函数初始化列表以及对象成员的构造
- java 初始化顺序以及由此可能引发的构造方法的潜在问题。
- 构造方法的调用顺序和成员变量的初始化时机以及动态绑定
- 关于Java程序中类定义对象的处理,以及类中变量与方法的运行过程
- 类的加载、创建对象、静态变量static、构造函数、静态代码块、构造代码块、构造方法以及总结
- iOS category中的所谓属性 和 从xib初始化对象的方法 以及类扩展