文档介绍:面向对象编程的深入讨论
第六章
目标
构造函数的执行机制
屏蔽、覆盖和重载
对象间的类型转换
对象之间的比较
2
构造函数的执行机制
构造函数的作用:对创建的对象进行初始化
类的继承机制:子类可以使用父类的功能(即代码),
那么子类对象的初始化要使用到父类的构造函数。
3
class SuperClass {
SuperClass() {
("SuperClass constructor");
}}
public class SubClass extends SuperClass {
SubClass() {
("SubClass constructor");
}
public static void main(String[] args) {
SubClass sub = new SubClass();
}
}
例子6-1
类在继承关系上的初始化的顺序
4
例子6-1
在子类中只实例化了一个子类对象。
从输出结果上看:
程序并不是一开始就运行自己的构造方法,
而是先运行其父类的默认构造方法。
注意:程序自动调用其父类的默认构造方法。
子类对象初始化
父类
构造函数
5
class SuperClass{
SuperClass(String str) {
("Super with a string.");
}
}
public class SubClass extends SuperClass{
SubClass(String str) {
("Sub with a string.");}
public static void main(String[] args) {
SubClass sub = new SubClass("sub");
}
}
SubClass未找到其父类的默认构造方法SuperClass() ,编译通不过
SuperClass() { };
方法1:在父类中增加一个默认构造方法。 SuperClass(){};
//SuperClass() { };
super(str);
方法2:在子类的构造方法中第一句增加“super(str)”
例6-2:
6
public class Test {
public static void main(String[] args){
("Test main()");
Car car = new Car("car");
}}
输出结果为:
Test main()
wheel-1
wheel-2
wheel-3
car
例6-3:对象的初始化顺序问题
在main()方法中初始化car类的对象时,
先初始化car类的成员变量,(成员变量是wh对象则调用该对象相应的构造方法)。
而后再初始化car类的对象, 即调用car类的构造方法
class Wheel {
Wheel(String str) {
(str);
} }
class car {
Wheel wheel_1 = new Wheel ("wheel-1");
Wheel wheel_2 = new Wheel ("wheel-2");
Wheel wheel_3 = new Wheel ("wheel-3");
Car(String str) {
(str);
} }
7
例6-3:对象的初始化顺序
在创建对象时,对象所在类的所有数据成员会首先进行初始化
如果其中的成员变量有对象,那么它们也会按照顺序执行初始化工作。
在所有类成员初始化完成后,才调用对象所在类的构造方法创建对象。构造方法作用就是初始化。
在test类中创建car对象时,先
初始化“car”类的成员变量
成员变量wheel_1, wheel_1,
wheel_1等按顺序初始化
最后调用car类的构造函数
8
public class Test {
public static void main(String[] args){
("Test main()");
Car car_1 = new car("car-1");
("------------");
Car car_2 = new car("car-2");
}
}