super 与 this 同时使用问题
大家都知道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 同时使用问题的更多相关文章
- JavaSE(二)之继承、封装、多态
学习完类与对象终于认识到什么是类,什么是对象了.接下来要看的就是java的三大特征:继承.封装.多态. 一.封装(数据的隐藏) 在定义一个对象的特性的时候,有必要决定这些特性的可见性,即哪些特性对外部 ...
- 2019JAVA课程总结
课程总结 1.子类不能直接访问父类的私有属性,可通过get(),set()来间接访问. 2.super(),this()不可同时使用,因为其都必须放在首行,所以不可同时使用. 3.若删去super() ...
- java_day05_类和对象
chap05目标:类和对象---------------------------------------------- 1.OOP特征概述 Java的编程语言是面向对象的,采用这种语言进行编程称为面向 ...
- 通过URLOS安装Redis缓存为wordpress网站提速
快!快!快!我们都知道网站的加载速度直接影响用户体验.据研究发现,网站页面在3秒内加载完毕对用户而言是最佳的浏览体验.如果超过这个时间,用户跳出网站的几率会非常大.所以对于站长来说,提高速度是他们追求 ...
- JAVA实验三及总结
JAVA第五周作业 Java实验报告三 第一题 1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) (1).统计该字符 ...
- Java基本概念:继承
一.简介 描述: 现实世界中的继承无处不在.比如:动物细分有哺乳动物.爬行动物等,哺乳动物细分有灵长目.鲸目等. 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模. 继承是类和类之间的一种关 ...
- Java--继承和super关键字
一.Java中方法的参数传递(重点) Java中参数传递都是值传递 Java中的值分两种: 1.如果传递的参数是基本数据类型: 传递的值就是基本数据类型的值. 传递的时候,其实是把基本数据类型的值,复 ...
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法
四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 ...
随机推荐
- 用JMX远程监控Tomcat
要通过JMX远程监控Tomcat,首先需要进行Tomcat的JMX远程配置. 注意:此配置添加在catalina.bat文件开头的注释行(rem)后面即可. 不需鉴权的配置: 先修改Tomcat的启动 ...
- An internal error occurred during: "Launching New_configuration"
问题: 点击运行时eclipse报错如下: An internal error occurred during: "Launching New_configuration". Pa ...
- Docker Hub工作流程-Docker for Web Developers(6)
在Github上创建项目仓库 和创建其他Github项目一样,在Github创建一个仓库,然后在仓库里面增加一个dockerfile,然后提交并推送到Github上. 我已经创建的仓库地址:https ...
- Primeton BPS 6.7+MyEclipse_5.5.1GA_E3.2.2插件安装
准备 Primeton_BPS_6.7_Developer MyEclipse5.5插件版 BPS安装 MyEclipse插件安装 点击MyEclipse_5.5.1GA_E3.2.2_Install ...
- php面试问题
问题:请用最简单的语言告诉我PHP是什么? 回答:PHP全称:Hypertext Preprocessor,是一种用来开发动态网站的服务器脚本语言. 问题:什么是MVC? 回答:MVC由Model(模 ...
- 小发现之location.search与location.hash问题
背景 用过Vue Router的童鞋应该对路由传参的方式多多少少有些印象,Vue Router支持两种传参方式:query与params:其中query方式就是动态地在路由url后面追加参数,就是ht ...
- vue中数据双向绑定注意点
最近一个vue和element的项目中遇到了一个问题: 动态生成的对象进行双向绑定是失败 直接贴代码: <el-form :model="addClass" :rules=& ...
- laravel中token的使用方式
在form表单里提交表单时,可 <form action="" method="post"> <?php echo csrf_field() ...
- mysql 转义字符
在用户提交表单的时候,有的用户会提交一些特殊字符,比如单引号双引号,此时,如果直接按正常字符串插入数据库的话,可能会出现无法正确插入数据库 PDO::quote 转义mysql语句中的单引号和双引号 ...
- JAVA类型擦除
Java泛型-类型擦除 一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Num ...