首页 > 编程语言 >探秘Java语言中子类调用父类的构造方法的方式

探秘Java语言中子类调用父类的构造方法的方式

时间:2023-10-15 13:01:56浏览次数:43  
标签:Java Sub 构造方法 Base java 父类 public

父类的构造方法不能被子类继承。假定Base父类有以下构造方法:

public Base(Srting msg){
  this.msg=msg;
}

以下Sub类继承了Base类:

public class Sub extends Base{}

以上Sub类有一个隐含的默认构造方法,形式如下:

public Sub(){}

尽管在Base父类中定义了如下形式的构造方法:

public Base(String msg)

但Sub类不会继承Base类的构造方法,因此以下代码是不合法的:

//非法,Sub类不存在这样的构造方法
Sub b=new Sub("Hello");

在子类的构造方法中,可以通过super语句调用父类的构造方法。例如:

public class Sub extends Base{
  public Sub(){
    //调用Base父类的Base(String msg)构造方法
    super("Hello");
  }

  public Sub(String msg){
    //调用Base父类的Base(String msg)构造方法
    super(msg);
  } 
}

假如在子类的构造方法中有super语句,它必须作为构造方法的第一条语句(不考虑注释语句),以下代码是非法的:

public Sub(){
  String msg= "Hello";
  super(msg);       //非法,super语句必须作为构造方法的第一条语句
}

在通过new语句创建子类的实例时,Java虚拟机首先执行父类的构造方法,再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法。

探秘Java语言中子类调用父类的构造方法的方式_java

大力向卫琴请教创建子类对象,先调用父类构造方法的意义

探秘Java语言中子类调用父类的构造方法的方式_父类_02

创建子类实例时,先调用父类构造方法,再调用子类构造方法

在例程1的Base.java和Sub.java中,Base父类和Sub子类分别有一个实例变量a和b,当创建Sub类的实例时,这两个实例变量都会被初始化。

例程1 Base.java和Sub.java

/** Base.java */
package mypack4;
public class Base{
  int a;
  public Base(int a){ this.a=a;}
}

/** Sub.java */
package mypack4;
public class Sub extends Base{
  int b;
  public Sub(int a,int b){
    super(a);                          //初始化父类的实例变量a
    this.b=b;                          //初始化子类的实例变量b
  }
  
  public static void main(String args[]){
    Sub sub=new Sub(1,2);
    System.out.println(sub.a+","+sub.b);       //打印1,2
  }
}

大力:“如果子类的构造方法没有通过super语句调用父类的构造方法,那会怎么样呢?”

卫琴姐:“此时Java虚拟机会自动先调用父类的不带参数的构造方法。”

在例程2的Base.java和Sub.java中,Base类有一个不带参数的构造方法。Sub类的Sub(int i)构造方法没有用super语句调用父类的构造方法,因此当创建Sub类的实例时,会先自动调用Base父类的不带参数的构造方法。

例程2 Base.java和Sub.java

/** Base.java */
package mypack5;
public class Base{
  public Base(){             //不带参数的构造方法
    System.out.println("call Base()");
  }
}  

/** Sub.java */
package mypack5;
public class Sub extends Base{
  public Sub(){
    System.out.println("call Sub()");
  }

  public static void main(String args[]){
    Sub b=new Sub();  
  }
}

运行Sub类,会得到以下打印结果:

call Base()
call Sub()

如果把Base类的不带参数的构造方法改为:

public Base(int a){}        //带参数的构造方法

编译Sub类时会出错, 因为Base父类中没有可以被Sub类自动调用的不带参数的构造方法。一种修改方式为:在Sub类的构造方法中,通过super语句显式调用父类的构造方法:

public Sub(){
  super(1);          //调用Base父类的Base(int a)构造方法
  System.out.println("call Sub()");
}

上文参考孙卫琴的经典Java书籍《Java面向对象编程》

探秘Java语言中子类调用父类的构造方法的方式_java_03

标签:Java,Sub,构造方法,Base,java,父类,public
From: https://blog.51cto.com/sunweiqin/7871402

相关文章

  • Java面试题支招-为什么Java语言不支持多继承
    这是非常经典的问题,与“为什么String类在Java中是不可变的”很类似;这两个问题之间的相似之处在于它们主要是由Java创作者的设计决策使然。Java不支持类的多继承。因为多继承会增加编程的复杂性。下图选自孙卫琴的经典Java书籍《漫画Java编程》当一个子类有多个父类可能出......
  • 趣味解释Java虚拟机是啥玩意
    下文通过生动形象的例子,帮助小伙伴们轻轻松松地理解Java虚拟机的基本作用。大力:“为什么说Java语言是一种高级编程语言呢?”卫琴:“之所以称Java为高级语言,是因为它和人类的语言有一点点相近。比如用Employee类表示员工,用name属性表示员工的姓名,用selfIntro()方法模拟员工的自我介绍......
  • java——redis随笔——实战——商户查询缓存
                      把key做了下代码优化: /***根据id查询商铺信息*@paramid商铺id*@return商铺详情数据*/@OverridepublicResultqueryById(Longid){//key要唯......
  • java项目实践-webapp-mytomcat-day16
    目录1.http协议2.自定义的web框架3.具体实现4.启动1.http协议CS架构建立连接“三次握手”断开连接“四次挥手”三次握手:client:可以与你建立连接吗?server:可以的client:我也可以了四次挥手:client:我要断开server:可以断开server:我要断开client:可以断开双方都有......
  • java学习笔记day03
    java学习笔记day03数据类型public class 数据类型 {  public static void main(String[] args){    //整数类型    byte num1 = 10;    short num2 = 200;    int num3 = 3000;    long num4 = 400000L;    ......
  • JavaWeb-Maven的应用
    目录1.MavenPOM2.pom.xml内容MavenPOMPOM(ProjectObjectModel,项目对象模型)是Maven工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven会在当前目录中查找POM。它读取POM,获取所需的配置信息,然......
  • 从零开发一款图片编辑器(使用html5+javascript)
    最近开发了一个图片编辑器,类似于photoshop的网页版,源码参考自GitHub上,顺便也总结下使用html+js开发一个编辑器需要用到哪些知识点。预览地址:https://ps.gitapp.cngithub地址:https://github.com/photopea/photopea架构设计选型:jquery.js和blueimp-canvas.js都是强大的......
  • JAVA大文件(10G以上)的上传下载实现技术
    在现代互联网应用中,经常需要上传和下载大文件,如视频、音频、数据库备份等等。对于Java开发者来说,处理大文件上传下载是一个非常常见的需求。然而,由于Java内存限制和网络传输速度的限制,处理大文件上传下载需要一些特殊的技术。本文将介绍一种基于流的方式来实现Java大文件的上传和......
  • 深入理解 JavaScript 时间分片:原理、应用与代码示例解析
    JavaScript时间分片(TimeSlicing)是一种优化技术,用于将长时间运行的任务拆分为多个小任务,以避免阻塞主线程,提高页面的响应性和性能。本文将详细解释JavaScript时间分片的原理、应用场景,并通过代码示例帮助读者更好地理解和应用该技术。本文首发于:kelen.cc概念时间分片(TimeSl......
  • Javascript、axios、vue基础命令快速学习
    1.js:JavaScript基础学习JavaScript基础学习简单案例1.点击img1,则展示img1图片默认,点击img2则展示img2图片2.输入框鼠标聚焦onfocus后,显示小写toLowerCase(),失去焦点onblur后显示大写toUpperCase()3.点击全选按钮,所有复选框为被选中状态,点击反选则取消勾选状态JavaScrip......