大家都知道this 和 super 调用构造函数时都必须放在第一句,今天同学问我的一个问题有点意思。

那么:我怎么在子类中 显式的用 super 初始化父类同时用 this 初始化子类?

-------------------------------------------------------------------------------------

首先大家必须认识到两点:

1. super 调用构造函数的 作用是 为了初始化子类前先初始化父类,仅此而已。

2. 每个类的构造函数有且仅有一个会执行属性的初始化,即使你用的this, 那最后实际上也是this 指向的那个构造函数会执行。

下面分两种情况具体分析下

(1) 父类提供了无参的构造函数

这种情况比较简单,因为子类的构造函数会自动的调用父类的无参构造方法,不需要显式的加 super()。

但如果我手贱,硬要加怎么办?那么会无法编译,不然这样就多次初始化父类了,有 导致不一致状态 的潜在风险。

如下图:父类提供了一个无参的构造函数,子类有一个默认构造函数,三个带参的构造函数。

    上文说了,实例化时,有且仅有一个构造函数会执行,当用son1(), son1(int p3) 都最终会调用最后一个构造函数,

    所以最后一个构造函数执行前会调用父类的构造函数,如果son1(), son1(int p3) 也显示的调用super(),则多次初始化父类了,

    这显然是不对的;而 son1(int p2, int p3) 自己初始化属性,所以没这个问题,可以显式的调用super()。

public class father {
int age;
public father(){
age = 50;
}
} public class son1 extends father{
int property1;
int property2;
int property3; public son1(){
this(1,2,3);
} public son1(int p3){
this(1,2,p3);
} public son1(int p2, int p3){
super();
property1 = 1;
this.property2 = p2;
this.property3 = p3;
} public son1(int p1, int p2, int p3){
super();
property1 = p1;
property2 = p2;
property3 = p3;
}
}

(2) 父类没有提供无参的构造函数

此时必须在子类中显式调用super(parm) 初始化父类。

同样,后面的两个构造函数必须显式的调用 super

public class Father {

    int age;

    public Father(int age) {
this.age = age;
}
} public class Son extends Father{
int property1;
int property2;
int property3; //构造函数1
public Son(){
//super(40);
this(1,2,3);
} //构造函数2
public Son(int p3){
//super(40);
this(1,2,p3);
} //构造函数3
public Son(int p2, int p3){
super(40);
property1 = 1;
this.property2 = p2;
this.property3 = p3;
} //构造函数4
public Son(int p1, int p2, int p3){
super(40);
property1 = p1;
property2 = p2;
property3 = p3;
}
}

总结:this 与  super 调用构造函数时,都必须第一行,这样导致他们不能同时使用,但你并不需要担心没有初始化父类。

   因为,this 最终指向的子类构造函数中,一定会调用super() 初始化父类,默认的或者带参的。

super 与 this 同时使用问题的更多相关文章

  1. JavaSE(二)之继承、封装、多态

    学习完类与对象终于认识到什么是类,什么是对象了.接下来要看的就是java的三大特征:继承.封装.多态. 一.封装(数据的隐藏) 在定义一个对象的特性的时候,有必要决定这些特性的可见性,即哪些特性对外部 ...

  2. 2019JAVA课程总结

    课程总结 1.子类不能直接访问父类的私有属性,可通过get(),set()来间接访问. 2.super(),this()不可同时使用,因为其都必须放在首行,所以不可同时使用. 3.若删去super() ...

  3. java_day05_类和对象

    chap05目标:类和对象---------------------------------------------- 1.OOP特征概述 Java的编程语言是面向对象的,采用这种语言进行编程称为面向 ...

  4. 通过URLOS安装Redis缓存为wordpress网站提速

    快!快!快!我们都知道网站的加载速度直接影响用户体验.据研究发现,网站页面在3秒内加载完毕对用户而言是最佳的浏览体验.如果超过这个时间,用户跳出网站的几率会非常大.所以对于站长来说,提高速度是他们追求 ...

  5. JAVA实验三及总结

    JAVA第五周作业 Java实验报告三 第一题 1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) (1).统计该字符 ...

  6. Java基本概念:继承

    一.简介 描述: 现实世界中的继承无处不在.比如:动物细分有哺乳动物.爬行动物等,哺乳动物细分有灵长目.鲸目等. 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模. 继承是类和类之间的一种关 ...

  7. Java--继承和super关键字

    一.Java中方法的参数传递(重点) Java中参数传递都是值传递 Java中的值分两种: 1.如果传递的参数是基本数据类型: 传递的值就是基本数据类型的值. 传递的时候,其实是把基本数据类型的值,复 ...

  8. 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】

    官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...

  9. 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法

    四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 ...

随机推荐

  1. java加密算法入门(三)-非对称加密详解

    1.简单介绍 这几天一直在看非对称的加密,相比之前的两篇内容,这次看了两倍多的时间还云里雾里的,所以这篇文章相对之前的两篇,概念性的东西多了些,另外是代码的每一步我都做了介绍,方便自己以后翻阅,也方便 ...

  2. CSS设置一行文字,超出部分自动隐藏

    .textone { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; line-height: 25px; max-h ...

  3. JDBC 数据库连接操作——实习第三天

    今天开始了比较重量级的学习了,之前都是对于Java基础的学习和回顾.继续上篇的话题,<谁动了我的奶酪>,奉献一句我觉得比较有哲理的话:"学会自嘲了,而当人们学会自嘲,能够嘲笑自己 ...

  4. 使用zabbix_agent监控第一台windows服务器

    解压windows客户端压缩包 bin目录下会有win32和win64俩个文件夹,根据windows系统的版本自行进行选择,将客户端程序文件拷贝至C:\zabbix 将conf文件中的zabbix_a ...

  5. 如何退出 Vim

    点击 Esc 键,; Vim 进入命令模式.然后输入: :q  退出(这是 :quit 的缩写) :q! 不保存退出(这是  :quit! 的缩写) :wq 写入文件并退出:(这是 :writequi ...

  6. PHP把2个二维数组合并一个二维数组

    $a = array(0 => Array(id => 66,class_name => www.iiwnet.com),1 => Array(id => 67,clas ...

  7. 【Android Developers Training】 15. 启动一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. Exameple014实现html中checkbox的全选,反选和全不选(1)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. accp8.0转换教材第1章多线程理解与练习

    一.单词部分: ①process进程 ②current当前的③thread线程④runnable可获取的 ⑤interrupt中断⑥join加入⑦yield产生⑧synchronize同时发生 二.预 ...

  10. 如何编写高效的SQL

    编写高效的sql可以给用户带来好的体验,需要开发这没有意识到这一点因为他们不关心也不知道怎么做.高效的sql可以给用户节省很多时间,这样就不需要dba来找上门,也不需要搭建RCA和性能调优. 性能不好 ...