热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

关于Java继承中父类和子类构造函数的问题

这篇文章主要介绍了关于Java继承中父类和子类构造函数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数,

可以参考这篇Java子类实例化总是默认调用父类的无参构造操作

1、当父类没有显式定义构造方法时,

编辑器会默认为此类添加一个隐式无参构造函数。此时子类可以有自己的无参和有参构造方法。不论实例化时调用的是子类的有参还是无参构造函数,默认调用的是父类的无参构造函数。

2、当父类有显式定义无参构造方法时,

此时子类也可以有自己的无参和有参构造方法。类似于1,同样默认隐式调用父类的无参构造方法。

3、当父类只有显式定义有参构造方法时,

(1)子类定义无参方法会出错:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隐式父类构造函数Father()未定义, 必须显式调用另一个构造函数,当此时调用父类的有参构造函数时,使用super(i),这里i是参数,会提示i没有定义,因为此时是无参构造函数,此时要使子类也有无参构造函数,只能在子类的无参构造函数中调用父类的有参构造函数,并给父类的有参构造函数赋一个实参;

(2)在子类的有参构造函数中使用super(i)调用父类的有参构造函数不会出错,因此若父类只有有参的构造方法,子类也只能有有参的构造方法,且子类的有参构造方法必须显示调用父类的有参构造方法。

分析:默认都是调用父类的无参构造函数,当父类有有参构造函数时,编辑器不会为父类添加无参的构造函数,在子类继承父类时,本来是默认在构造函数第一行都是默认有使用super()调用父类无参构造函数的,现在父类没有无参构造函数,因此提示显示调用另一个构造函数(即有参构造函数)。

提醒一点,当没有子类继承父类时,父类只定义有参构造函数是没有问题的。

4、当父类和子类都有无参和有参构造方法时,默认是子类构造方法都是调用父类的无参构造方法的,但当子类的有参构造方法使用super(i)调用父类的有参构造方法时,带参数实例化时就不再调用父类的无参构造方法,而是调用父类的有参构造方法,因为是显示调用(人为强制的)。

总结:

父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数;当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类无参构造函数也必须显式调用父类的有参构造函数,但需给父类有参构造函数赋实参。

1中的示例:

package classTest;
class Father1{

}
class Son1 extends Father1{
 public Son1() {
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {

 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
}
}

运行结果:

子类的无参构造方法

2中的示例:

package classTest;


class Father1{
 public Father1() { 
 }
}
class Son1 extends Father1{
 public Son1() {
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
}
}

运行结果:

子类的无参构造方法

3中的示例(1):

package classTest;
class Father1{

 public Father1(int i) {
 System.out.println("父类中的有参构造方法"+i);
 }
}
class Son1 extends Father1{

 public Son1() {
  //下两行需注释掉一行
 super(i);//此时会报错
 super(1);//此时不会报错,调用父类构造函数,但参数值是固定的,不能在调用时传入其他值。
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {
   super(i);
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
}
}

结果:显示参数没有定义

Exception in thread "main" java.lang.Error: Unresolved compilation problem: i cannot be resolved to a variable

3中的示例(2):

package classTest;
class Father1{
 public Father1(int i) {
 System.out.println("父类中的有参构造方法"+i);
 }
}
class Son1 extends Father1{
 public Son1(int i) {
   super(i);
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 System.out.println("-----");
 Son1 a = new Son1(5);
}
}

结果:

-----

父类中的有参构造方法5

子类中有参构造方法5

4中的示例:

package classTest;
class Father1{
 public Father1() {
 System.out.println("父类的无参构造方法");
}
 public Father1(int i) {
 System.out.println("父类中的有参构造方法"+i);
 }
}
class Son1 extends Father1{

 public Son1() {
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {
   super(i);
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
 System.out.println("-----");
 Son1 a = new Son1(5);
}
}

结果:

父类的无参构造方法

子类的无参构造方法

-----

父类中的有参构造方法5

子类中有参构造方法5

以上这篇关于Java继承中父类和子类构造函数的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 帝国CMS多图上传插件详解及使用指南
    本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
  • 如何在CAD查看器中同时打开并对比两张DWG图纸
    本文将详细介绍如何使用专业的CAD查看软件,如迅捷CAD看图,来同时打开和对比两张DWG格式的CAD图纸。无论是在设计审核还是项目管理中,掌握这一技能都能显著提高工作效率。 ... [详细]
  • 编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • Ulysses Mac v29:革新文本编辑与写作体验
    探索Ulysses Mac v29,这款先进的纯文本编辑器为Mac用户带来了全新的写作和编辑环境。它不仅具备简洁直观的界面,还融合了Markdown等标记语言的最佳特性,支持多种格式导出,并提供强大的组织和同步功能。 ... [详细]
  • 本文详细介绍了Vim编辑器的三种主要模式及其常用命令,帮助用户更好地掌握这一强大的文本编辑工具。 ... [详细]
  • 解决Windows 10开机频繁自检问题的实用方法
    许多用户在使用Windows 10系统时,经常会遇到开机时自动进行磁盘检查的情况。这不仅影响了开机速度,还可能带来不必要的麻烦。本文将详细介绍如何通过简单的注册表修改来避免每次开机时的磁盘自检,提升系统启动效率。 ... [详细]
  • 本文详细介绍了流编辑器sed中的G、H、g、h命令,探讨了它们的工作原理及应用场景。通过实例解析和图解分析,帮助读者掌握这些高级命令的使用方法。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • 本文介绍了解决Oracle 10G数据库中ORA-12541 TNS: no listener错误的详细步骤。该错误通常发生在监听器服务未正确启动或配置不当的情况下,文章将指导您通过检查服务状态、配置注册表和启动监听器来解决问题。 ... [详细]
  • 在安装 SQL Server 时,选择混合验证模式可以提供更高的灵活性和管理便利性。如果您已经安装了 SQL Server 并使用单一的 Windows 身份验证模式,可以通过以下步骤将其更改为混合验证模式。 ... [详细]
  • 本文介绍了在 SQL Server 2012 客户端中格式化 SQL 查询语句的多种方法,包括内置功能和第三方工具,帮助用户提高代码可读性和维护性。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
author-avatar
迪信通张磊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有