大家都知道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. discuz用户登录不响应,提示nginx gateway timeout解决方法

    在使用nginx+php-cgi搭建discuz论坛过程中,出现论坛登录不响应,一直提示nginx gateway timeout504网关超时,单单采用php方式登录无问题.但因需要使用nginx把 ...

  2. ionic2 tabs使用自定义图标

    在ionic2中图标是通过类添加的 比如说   tabIcon="homeImg" 在页面中研究可以看到在ios上有一个类是 .ion-ios-homeImg:before 所以我 ...

  3. iOS的内存分析和内存管理

    iOS的内存分析和内存管理 [内存管理]一直是iOS开发中的一个重点. 本文就带你从内存分析开始一步步了解内存的占用情况,从真实的情况中领悟真正项目开发过程中的内存的使用情况. 注:本文默认你熟悉 M ...

  4. Linux find运行机制详解

    本文目录: 1.1 find基本用法示例 1.2 find理论部分 1.2.1 expression-operators 1.2.2 expression-options 1.2.3 expressi ...

  5. Thread初探

    Thread初探 前言 以前大家写的都是单线程的程序,全是在main函数中调用方法,可以清楚的看到它的效率是特别低的,就像python中使用单线程取爬一个网站,可以说能让你等的吐血,因为数据量实在太大 ...

  6. web移动端布局方式整理

    写H5页面一直写的有点随意,只是保证了页面在各个屏幕下显示良好,却没有保证到在各个屏幕下是等比例放大或者缩小.这些天在写一些页面,试着看看能不能写出等比例放大缩小的页面,发现不容易啊,在网上找了一些文 ...

  7. Reids命令解析-RENAME

    有一天开发突然照过来问,维萨我这个Redis实例这么慢呢?为什么这么慢,于是连上实例SLOWLOG 一看,这些慢日志都是大部分是RENMAE操作导致的,可是为什么RENAME操作会慢呢?不就是改个名字 ...

  8. Linux编程之epoll

    现在有这么一个场景:我是一个很忙的大老板,我有100个手机,手机来信息了,我的秘书就会告诉我"老板,你的手机来信息了."我很生气,我的秘书就是这样子,每次手机来信息就只告诉我来信息 ...

  9. Bootstrap警告框

    前面的话 在网站中,网页总是需要和用户一起做沟通与交流.特别是当用户操作上下文为用户提供一些有效的警示框,比如说告诉用户操作成功.操作错误.提示或者警告等.在Bootstrap框架有一个独立的组件,实 ...

  10. java程序员常见面试题目

      答:每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象.实际上,产生了异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句捕获的话,则可以进行异常的处理,否则 ...