Java构造函数继承与调用机制解析
在Java编程语言中,继承是面向对象编程的一个关键特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。这有助于代码重用和构建复杂的类层次结构。当我们谈论“构造函数的继承问题”时,主要是指在创建子类对象时如何正确地调用父类的构造函数。 首先,每个Java类都有一个或多个构造函数,它们的职责是在创建新对象时初始化实例变量。如果一个类没有显式定义任何构造函数,Java编译器会自动提供一个默认的无参构造函数,即所谓的默认构造函数。 在子类继承父类的情况下,有两种情况需要考虑: 1. **父类没有显式构造函数**: - 如果父类没有任何构造函数,编译器会自动为父类生成一个默认的无参构造函数。在这种情况下,子类可以创建自己的构造函数,无论是无参还是有参。当子类构造函数被调用时,编译器会自动在其内部添加对父类默认构造函数的调用,以确保父类的状态得到初始化。 2. **父类有显式构造函数**: - 如果父类有显式定义的构造函数,子类在创建构造函数时必须通过`super()`关键字显式调用父类的构造函数,来初始化父类的部分。这是因为子类构造函数在执行自身初始化操作之前,需要确保父类已经完成了初始化。如果不这样做,编译器会报错,因为父类的构造函数没有被调用。 例如,以下代码展示了构造函数继承的不同情况: ```java // 基础类 base class Base { // 默认构造函数 Base() { System.out.println("Base constructor"); } // 带参数的构造函数 Base(int i) { System.out.println("Base constructor with int i"); } } // 派生类 derived class Derived extends Base { // 没有显式调用父类构造函数 Derived() { System.out.println("Derived constructor"); } // 显式调用父类无参构造函数 Derived(int j) { super(); // 调用父类的无参构造函数 System.out.println("Derived constructor with int j"); } // 显式调用父类带参数构造函数 Derived(double d) { super((int)d); // 类型转换并调用父类的带参数构造函数 System.out.println("Derived constructor with double d"); } } // 测试 public static void main(String[] args) { Derived d1 = new Derived(); // 自动调用父类的无参构造函数 Derived d2 = new Derived(10); // 显式调用父类的无参构造函数 Derived d3 = new Derived(15.6); // 显式调用父类的带参数构造函数 } ``` 在上述代码中,`Derived`类继承了`Base`类。如果没有显式调用父类的构造函数,编译器会自动在子类构造函数中插入`super()`调用,就像`Derived`类的无参构造函数那样。在其他两个构造函数中,我们显式地调用了父类的构造函数,以满足特定的需求。 总结来说,Java中的构造函数继承规定了子类必须在初始化自身之前确保父类已经被正确初始化。这通常通过`super()`关键字来实现,使得子类构造函数能够调用父类的构造函数,无论是无参还是带参数的。了解这一点对于理解和编写正确的继承代码至关重要,避免在创建子类对象时出现错误。
这是我的读书笔记,希望能够对大家学习java有所帮助。
所有代码都经过测试,测试环境:
java version "1.4.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)
如大家发现任何错误,或有任何意见请不吝赐教。
缺省构造函数的问题:base类是父类,derived类是子类,首先要
说明的是由于先有父类后有子类,所以生成子类之前要首先有父类。
class是由class的构造函数constructor产生的,每一个class都有
构造函数,如果你在编写自己的class时没有编写任何构造函数,那么
编译器为你自动产生一个缺省default构造函数。这个default构造函数
实质是空的,其中不包含任何代码。但是一牵扯到继承,它的问题就出现
了。
如果父类base class只有缺省构造函数,也就是编译器自动为你产生的。
而子类中也只有缺省构造函数,那么不会产生任何问题,因为当你试图产生
一个子类的实例时,首先要执行子类的构造函数,但是由于子类继承父类,
所以子类的缺省构造函数自动调用父类的缺省构造函数。先产生父类的实例,
然后再产生子类的实例。如下:
class base{
}
class derived extends base{
public static void main(String[] args){
derived d=new derived();
}
}
下面我自己显式地加上了缺省构造函数:
class base{
base(){
System.out.println("base constructor");
}
}
class derived extends base{
derived(){
System.out.println("derived constructor");
}
public static void main(String[] args){
derived d=new derived();
}
}
执行结果如下:说明了先产生base class然后是derived class。
base constructor
derived constructor
我要说明的问题出在如果base class有多个constructor
而derived class也有多个constructor,这时子类中的构造函数缺省
调用那个父类的构造函数呢?答案是调用父类的缺省构造函数。
但是不是编译器自动为你生成的那个缺省构造函数而是你自己显式地
写出来的缺省构造函数。
class base{
base(){
System.out.println("base constructor");
}
剩余5页未读,继续阅读
- 粉丝: 2
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IPQ4019 QSDK开源代码资源包发布
- 高频组电赛必备:掌握数字频率合成模块要点
- ThinkPHP开发的仿微博系统功能解析
- 掌握Objective-C并发编程:NSOperation与NSOperationQueue精讲
- Navicat160 Premium 安装教程与说明
- SpringBoot+Vue开发的休闲娱乐票务代理平台
- 数据库课程设计:实现与优化方法探讨
- 电赛高频模块攻略:掌握移相网络的关键技术
- PHP简易简历系统教程与源码分享
- Java聊天室程序设计:实现用户互动与服务器监控
- Bootstrap后台管理页面模板(纯前端实现)
- 校园订餐系统项目源码解析:深入Spring框架核心原理
- 探索Spring核心原理的JavaWeb校园管理系统源码
- ios苹果APP从开发到上架的完整流程指南
- 深入理解Spring核心原理与源码解析
- 掌握Python函数与模块使用技巧