首页 理论教育 Java程序设计:子类调用父类构造方法

Java程序设计:子类调用父类构造方法

时间:2023-11-01 理论教育 版权反馈
【摘要】:图4-9HisTriangle2类的定义在His Triangle2子类的构造方法中,通过super关键字调用父类HisGraph的构造方法,语法为super()或者super。图4-10创建子类对象并调用相关方法程序第4行实例化一个His Triangle2对象,引用变量t指向该对象。子类调用相应的构造方法,通过super关键字调用父类中的构造方法,父类对实例变量默认初始化,接着显式初始化,最后通过构造方法进行特定初始化。

Java程序设计:子类调用父类构造方法

在构造一个子类对象时,首先会调用父类的构造方法,如果父类又继承自其他类,那么父类又会先调用它自己父类的构造方法,直到该继承体系的最顶层类的构造方法被调用为止。

【例4-2】

定义一个继承自HisGraph类的子类His Triangle2,子类新增加成员变量(三边长),并测试。

步骤1:新定义的子类His Triangle2可以在His Triangle1类的基础上修改。下面举例说明如何利用Eclipse拷贝一个类并重命名

(1)在视图“Package Explorer”中选择待复制的类His Triangle1,鼠标点击右键,在弹出的菜单中选择【Copy】,如图4-5所示。

图4-5 复制源文件

(2)选择要粘贴的目的地包名“cn.linaw.chapter4.demo01”,鼠标点击右键,在弹出的菜单中选择【Paste】,如图4-6所示。

图4-6 粘贴源文件

(3)在弹出的对话框中重命名类名为His Triangle2,点击【OK】按钮完成,如图4-7所示。

图4-7 重命名类名(同一包下)

如果粘贴的目的地是不同包下,由于文件名不冲突,图4-7不会出现,此时修改文件名,需要在文件名上点击鼠标右键,在弹出的菜单中选择【Refactor】项目下的【Rename】项目,在弹出的对话框中重命名类名,如图4-8所示。

图4-8 重命名类名(不同包下)(www.xing528.com)

需注意的是,在复选框中取消默认勾选的“Update references”,否则重命名会导致所有引用该类的地方修改。另外,还可以通过该方式在源代码中修改变量名或方法名,可以同时修改掉所有引用的地方。

步骤2:修改His Triangle2类,增加成员属性(边长a、b、c)、增加构造方法、setter和getter,如图4-9所示。

图4-9 HisTriangle2类的定义

在His Triangle2子类的构造方法中,通过super关键字调用父类HisGraph的构造方法,语法为super()或者super(参数列表)。如果子类调用父类无参构造方法,super()可以省略,编译器自动会在第一行增加super()语句;如果子类调用父类有参构造方法,则必须使用super关键字显式调用。super使用语法和this关键字的类似,super关键字也必须用在子类构造方法的第一行(此时,this关键字和super关键字不能共存)。

步骤3:通过一个测试类His Triangle2Test来创建子类对象,然后调用父类和自身方法,如图4-10所示。

图4-10 创建子类对象并调用相关方法

程序第4行实例化一个His Triangle2对象,引用变量t指向该对象。程序第5行调用了父类方法get Name(),结果显示该子类对象的父类成员变量name已经被初始化为Triangle。程序第6~9行演示了调用子类自己的方法。

下面对子类对象初始化过程做一个小结:

(1)当一个类首次被使用时(例如第一次创建该类对象时,或者首次访问该类的静态成员时),系统就会加载该类。加载时,首先将子类的.class文件加载到方法区,通过extends关键字会继续加载父类的.class文件,若父类还继承自其他类,则系统会继续加载。

(2)被static修饰的静态成员属性在类加载时会默认初始化,当所有有继承关系的类加载完毕后,会从上向下,先父类,后子类依次对静态成员属性显式初始化。

(3)当用new关键字创建子类对象时,会在堆内存开辟空间,分配地址,对子类对象的实例变量进行默认初始化。子类调用相应的构造方法,通过super关键字调用父类中的构造方法,父类对实例变量默认初始化,接着显式初始化,最后通过构造方法进行特定初始化。父类初始化完毕后,再对子类的实例变量进行显式初始化,然后通过构造方法进行特定初始化。如果父类还继承自其他类,还是遵循上述从上向下的分层初始化过程。可见,最先初始化完毕的是java.lang.Object类的实例变量。

(4)初始化过程完毕后,将所创建对象的地址赋值给引用变量。

可见,初始化过程中,静态先于非静态,父类先于子类,同类中实例变量先于构造方法。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈