Java的继承中,关于子类和父类构造方法的使用。

子类在初始化时,一定会调用父类的构造方法。

原因如下:

在子类继承父类时,子类会继承父类所有的公共成员变量,公共方法,这些方法在子类中不再重复声明。

如果在初始化子类的时候,不初始化父类,那么子类在调用父类的方法和属性的时候,就会抛出异常,一次你通过调用父类的构造方法来初始化父类的公共成员变量和公共成员方法,才能够在子类中,正常对这些方法进行使用

因此:JVM会在你初始化子类的时候默认的初始化子类的父类,并且一层一层地往上递进。

一个小例子:

class Father{public Father(){System.out.println("Father Function");}
}
class Son extends Father{public Son(){System.out.println("Son Function");}
}
public class Test{public static void main(String[] args){Son son = new Son();}
}

输出:

Father Function
Son Function

在输出Son Function的同时输出了Father Function的原因在于:

父类的构造方法是不会被子类继承,但子类初始化时会调用父类构造方法。但通常,子类构造方法中会有一个隐式的super()来调用父类中的无参数构造方法。因此本例中,在初始化Son的实例的时候,先通过一个隐式的super()来调用了父类中的无参数构造方法,因此先输出了Father Function,然后调用Son的构造方法,输出了Son Function。

如果父类有多个构造方法,子类还是默认隐式调用super()来调用父类中的无参数构造方法。

一个例子:

class Father {public Father() {System.out.println("Father Function");}public Father(String str) {System.out.println("Father " + str);}
}
class Son extends Father {public Son() {System.out.println("Son Function");}public Son(String str) {System.out.println("Son " + str);}
}
public class Test {public static void main(String[] args) {Son son = new Son("Hello world");}
}

输出结果为:

Father Function
Son Hello world

由上面的例子可以看出,子类初始化的时候仍然先隐式调用了父类的无参方法。

以上的两种情况,均在子类中定义构造方法时没有显式调用super()的情况下。

当然,如果子类已经显式的调用了父类的构造方法,那么就不会再默认隐式调用父类的无参构造。

(听起来有点像定义一个类的构造方法时,如果没有自己定义构造方法,会默认有一个无参的构造方法,但如果自己定义了一个构造方法,就不会再默认生成一个无参的构造方法。)

一个例子:

class Father {public Father() {System.out.println("Father Function");}public Father(String str) {System.out.println("Father " + str);}
}
class Son extends Father {public Son(String str) {super(str);System.out.println("Son Hello");}
}
public class Test {public static void main(String[] args) {Son son = new Son("Hello world");}
}

输出:

Father Hello world
Son Hello

Java继承中的子类父类构造方法的调用相关推荐

  1. java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题

    Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自 ...

  2. 转转转!java继承中的this和super

    学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...

  3. java可以继承私有的,在java继承中,私有属性能否被继承

    其实在继承中,子类可以继承父类的私有属性的内容空间,但是不能继承父类私有属性的访问权限,下面看代码 父类Animal public class Animal { private String name ...

  4. 多继承中构造器和析构器的调用顺序

    多继承中构造器和析构器的调用顺序: 构造器的调用顺序就像盖房子,从最基层开始: 析构器的调用顺序就像拆房子,从最顶层开始:

  5. java继承中构造方法_java之继承中构造方法总结(文字版)

    子父类中的构造方法的特点 1. 在子类构造对象时,发现访问子类构造方法时,父类也运行了.为什么呢? 答:因为,在子类构造方法中第一行有一个默认的隐式语句:super(); 子类的实例化过程:子类中所有 ...

  6. java的子类调用构造器的顺序_深入剖析Java继承中的初始化与构造器调用关系

    声明:本文为牛旦教育原创,所有权保留,转载请注明来源. 一个对象有两件事:状态和行为. 类中的实例变量表示其对象的状态. 实例方法表示其对象的行为. 类的每个对象都保持自己的状态. 创建类的对象时,将 ...

  7. Java继承和多态——子类继承性

    类的继承格式 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下: class 父类 { }class 子类 extends 父类 { } 例子: cla ...

  8. Java 继承中的属性隐藏与方法重写

    一.变量隐藏--变量不具有多态性 Java 中的变量不遵循多态性,所以重写仅适用于方法,而不适用于变量. 并且,当子类中的实例变量与父类中的实例变量具有相同的名称时,则从引用类型中选择该实例变量. 在 ...

  9. java继承中的一些该注意的问题

    关于继承,我想大多数人都知道,它是面向对象语言中的三大特性之一,所以在这里,关于继承的概念等我就不做详细介绍了,我主要就讲一下大家对他的认识中一些比较容易犯的错误吧.   错误认识1.继承,是将父类中 ...

最新文章

  1. python 字典操作 内存占用,python - 如何强行释放字典使用的内存? - SO中文参考 - www.soinside.com...
  2. android 获取图片
  3. 微信小程序浮动按钮_操作按钮悬浮固定在微信小程序底部的实现代码
  4. split函数python 未定义_Python字符串方法split()中的一道坑
  5. 两篇讲述Skinned Mesh原理的文章
  6. HDU2108 Shape of HDU【多边形凹凸】
  7. PowerDesigner16工具学习笔记-建立CDM
  8. Atitit  图像处理Depixelizing Pixel Art像素风格画的矢量化
  9. Spring MVC+Stomp+Security+H2 Jetty 1
  10. spark sql 对接 HDFS
  11. Android抓包工具——Fiddler
  12. 鸢尾花数据集的可视化
  13. jflash合并bin文件及hex文件
  14. NASA 用哈勃望远镜定格你的星空
  15. 易优cms eyoucms登陆后台提示验证码错误
  16. n维椭球体积公式_考前必背!数量关系、资料分析常用公式汇总!不再头大!...
  17. PR2打印机参数设置
  18. 编译java源文件(在cmd下编译)傻瓜式教学
  19. mysql--sql中双引号 单引号' 反单引号`的作用和区别
  20. 计算机网络教程(第四版)

热门文章

  1. php+mysql等等的杂货
  2. 儿时回忆—— 童年的美食
  3. MATLAB 数学应用 线性代数 判断矩阵是否为对称正定矩阵
  4. 新的 TLS 加密破坏攻击也会影响新的 TLS 1.3 协议
  5. Kademlia协议原理简介
  6. “背景调查”是企业招聘“秘密武器”
  7. 第一章,06-行列式的降阶计算-余子式和代数余子式
  8. 如何对时间序列进行小波分析,得出其周期?
  9. OCR识别技术在行业中的应用
  10. 《Spring Boot in Action》【8. 部署】