java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题
Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数,
1、当父类没有显式定义构造方法时,
编辑器会默认为此类添加一个隐式无参构造函数。此时子类可以有自己的无参和有参构造方法。不论实例化时调用的是子类的有参还是无参构造函数,默认调用的是父类的无参构造函数。
2、当父类有显式定义无参构造方法时,
此时子类也可以有自己的无参和有参构造方法。类似于1,同样默认隐式调用父类的无参构造方法。
3、当父类只有显式定义有参构造方法时,
(1)子类定义无参方法会出错:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隐式父类构造函数Father()未定义, 必须显式调用另一个构造函数,当此时调用父类的有参构造函数时,使用super(i),这里i是参数,会提示i没有定义,因为此时是无参构造函数,此时要使子类也有无参构造函数,只能在子类的无参构造函数中调用父类的有参构造函数,并给父类的有参构造函数赋一个实参;
(2)在子类的有参构造函数中使用super(i)调用父类的有参构造函数不会出错,因此若父类只有有参的构造方法,子类也只能有有参的构造方法,且子类的有参构造方法必须显示调用父类的有参构造方法。
分析:默认都是调用父类的无参构造函数,当父类有有参构造函数时,编辑器不会为父类添加无参的构造函数,在子类继承父类时,本来是默认在构造函数第一行都是默认有使用super()调用父类无参构造函数的,现在父类没有无参构造函数,因此提示显示调用另一个构造函数(即有参构造函数)。
提醒一点,当没有子类继承父类时,父类只定义有参构造函数是没有问题的。
4、当父类和子类都有无参和有参构造方法时,默认是子类构造方法都是调用父类的无参构造方法的,但当子类的有参构造方法使用super(i)调用父类的有参构造方法时,带参数实例化时就不再调用父类的无参构造方法,而是调用父类的有参构造方法,因为是显示调用(人为强制的)。
总结:
父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数;当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类无参构造函数也必须显式调用父类的有参构造函数,但需给父类有参构造函数赋实参。
1中的示例:
package classTest;
class Father1{
}
class Son1 extends Father1{
public Son1() {
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
}
}
运行结果:
子类的无参构造方法
2中的示例:
package classTest;
class Father1{
public Father1() {
}
}
class Son1 extends Father1{
public Son1() {
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
}
}
运行结果:
子类的无参构造方法
3中的示例(1):
package classTest;
class Father1{
public Father1(int i) {
System.out.println("父类中的有参构造方法"+i);
}
}
class Son1 extends Father1{
public Son1() {
//下两行需注释掉一行
super(i);//此时会报错
super(1);//此时不会报错,调用父类构造函数,但参数值是固定的,不能在调用时传入其他值。
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
super(i);
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
}
}
结果:显示参数没有定义
Exception in thread "main" java.lang.Error: Unresolved compilation problem: i cannot be resolved to a variable
3中的示例(2):
package classTest;
class Father1{
public Father1(int i) {
System.out.println("父类中的有参构造方法"+i);
}
}
class Son1 extends Father1{
public Son1(int i) {
super(i);
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
System.out.println("-----");
Son1 a = new Son1(5);
}
}
结果:
-----
父类中的有参构造方法5
子类中有参构造方法5
4中的示例:
package classTest;
class Father1{
public Father1() {
System.out.println("父类的无参构造方法");
}
public Father1(int i) {
System.out.println("父类中的有参构造方法"+i);
}
}
class Son1 extends Father1{
public Son1() {
System.out.println("子类的无参构造方法");
}
public Son1(int i) {
super(i);
System.out.println("子类中有参构造方法"+i);
}
}
public class TestExtend {
public static void main(String[] args) {
Son1 s = new Son1();
System.out.println("-----");
Son1 a = new Son1(5);
}
}
结果:
父类的无参构造方法
子类的无参构造方法
-----
父类中的有参构造方法5
子类中有参构造方法5
以上这篇关于Java继承中父类和子类构造函数的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题相关推荐
- java 泛型对象实例化_在java中实例化泛型类型
慕仙森 在您发布的代码中,T由于您不知道它是什么类型,因此无法创建实例:public class Abc{ public T getInstanceOfT() { // There is no way ...
- java 默认参数 实例化_如何使用Kotlin中的默认构造函数参数值实例化对象?
使用在科特林: 在构造函数中的默认值仅服用时该构造的特定参数不传递到它在所有.那意味着它是为了实现各种组合的参数化构造函数. 例如, data class Bird (val name: String ...
- java什么叫实例化_在JAVA中实例化的确切含义是什么
小编典典 首先 声明的意思是 : ClassName obj; 实例化的 简单含义 是从class创建一个对象 . ClassName obj = new ClassName(); 什么是物体? 类的 ...
- java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- java中父类与子类的关系以及使用
java中父类与子类的关系以及使用 在java中规定:一个父类可以有多个子类,但是一个子类只能有一个父类.子类可以通过extends关键字来继承父类.做个比较通俗的比喻,就像一个父亲可以有多个亲孩子, ...
- java多态调用优先级_关于java的多态方法调用顺序的问题
使用父类类型的引用指向子类的对象,该引用调用的师父类中定义的方法和变量,变量不能被重写(覆盖):如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法: 注意特殊情况,如 ...
- java子类和父类实例_java中父类与子类之间的转换示例
java中父类与子类之间的转换示例有以下三点: 示例一 父类强制转子类 pre class="brush:php;toolbar:false">Father f = new ...
- java中父类与子类有相同属性调谁?取决于左边
java中父类与子类有相同属性调谁?答案是:取决于左边! 一. 在今天的继承复习当中,我有对继承中的属性有新的感悟------>子类继承父类,会继承父类的方法和属性,看下图: 从上图可以看出,即 ...
- C++继承中父类和子类之间的赋值兼容
文章目录 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 1.2 特殊的同名函数 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 在公有继承的条件下,子类对象可 ...
最新文章
- Ubuntu 系统禁止或者改变中文简体切换繁体,方便使用AS全局搜索
- python增加一列数据计算年龄_无法使用python中的条件计算年龄。得到一个价值
- Python+selenium 自动化 - 实现自动导入、上传外部文件实例演示
- linux 文件与进程
- foreach的工作原理和深拷贝、浅拷贝
- 数据结构---KMP模式匹配病毒感染人的DNA检测
- 腾讯安全科恩实验室发布最新研究成果,针对奔驰车载娱乐系统的安全研究
- Linux的分区类型
- php 检测变量中的回车键_PHP 的变量类型,变量检测
- php数据库的值嵌入input_求助:问个关于用INPUT提取数据库里的值然后修改的问题。...
- (10)VHDL例化verilog
- python画中秋的月亮_水彩中秋月亮教程
- 并发执行linux命令结果混乱,Shell脚本--并发执行
- 配置 sql server linux,配置SQL Server on Linux(2)
- 服务器如何修改内存大小,如何限制docker容器的内存大小
- 栈和队列基本概念,顺序栈的表示和实现
- EXCLE调用REFPROP操作以及问题
- Vue+elementUI下拉框自定义颜色选择器
- FL studio 20简易入门教程 -- 第七篇 -- 音频、音源与音色
- 如何获取微信服务号用户的openID
热门文章
- 微软推出Python免费在线教程视频
- 对Windows桌面应用程序进行UI自动化测试
- C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出
- 使用.NET Core+Docker 开发微服务
- [译]ASP.NET Core 2.0 带初始参数的中间件
- 发力企业级市场,微软Hololens开辟了一条VR新道路
- ABP框架搭建项目系列教程基础版
- MySQL - 触发器
- 网上书店模板asp与html,一个简单的网上书城的例子(三)_asp实例
- oracle optimizer_features_enable,Oracle Optimizer:迁移到使用基于成本的优化器—–系列2.1-数据库专栏,ORACLE...