首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java继承问题 - 必须在父类中创建空构造函数

在Java中,继承是一种面向对象编程的重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。当一个子类继承一个父类时,子类可以使用父类的非私有成员变量和方法,从而实现代码的重用和扩展。

在Java中,如果一个父类中没有定义任何构造函数,那么编译器会自动为父类生成一个默认的无参构造函数。这意味着子类可以通过调用父类的无参构造函数来创建父类的对象。

然而,如果父类中定义了一个或多个构造函数,那么编译器将不会自动生成默认的无参构造函数。这意味着如果你想在子类中使用父类的构造函数,你必须显式地在父类中创建一个空的无参构造函数。

为什么需要在父类中创建空构造函数呢?这是因为子类的构造函数会隐式地调用父类的构造函数来初始化继承的成员变量。如果父类没有定义任何构造函数,编译器会自动为父类生成一个默认的无参构造函数。但是,如果父类中定义了一个或多个构造函数,编译器将不会生成默认的无参构造函数。因此,为了确保子类能够正常地调用父类的构造函数,我们需要在父类中显式地创建一个空的无参构造函数。

这样做的好处是,子类可以通过调用父类的构造函数来初始化继承的成员变量,从而确保父类的属性被正确地初始化。同时,这也符合面向对象编程的原则,即子类应该能够完全替代父类。

总结起来,必须在父类中创建空构造函数的原因是为了确保子类能够正常地调用父类的构造函数来初始化继承的成员变量。这样做可以实现代码的重用和扩展,符合面向对象编程的原则。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 指针 指向 子类对象 | 使用 子类对象 为 对象 进行初始化 )

地方 , 都可以使用 " 公有继承 " 的 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 的 派生 ( 子类 ) 本质上 具有 基 ( ) 的 完整功能 , 使用 基 可以解决的问题 , 使用 公有继承派生 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生 , 是 不具有 基 的 完整功能的 , 因为 最终继承 后的派生 , 无法在 外部调用 的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...cout << " funParent 函数" << endl; } private: int c; }; // 子类 公有继承 class Child : public...函数 赋值兼容性原则示例 : funParent 函数 funParent 函数 funParent 函数 funParent 函数 Press any key to continue

28320

创建子类对象时,构造函数调用被子类重写的方法为什么调用的是子类的方法?

:为什么创建A对象的时候会调用子类方法?...但是:创建B对象会调用的方法? 答案: 当子类被加载到内存方法区后,会继续加载到内存。...如果,子类重写了的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向的方法引用。 如果子类重载了方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载方法,则方法引用会指向方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,构造方法调用的方法的参数已经强制转换为符合方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

6.2K10
  • ASP.NET AJAX(6)__Microsoft AJAX Library的面向对象类型系统命名空间——构造函数——定义方法——定义属性——注册——抽象——继承——调用

    定义构造函数 定义成员(方法、属性、事件) 注册 ——构造函数 构造函数即为function定义 通常用于初始化域变量 自由成员使用下划线开头(形式上的封装) ——定义方法 使用prototype..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 ——继承 调用构造函数必须调用构造函数,否则会丢失继承效果...可以直接以普通方式实现的抽象成员 toString方法无法被继承 ——调用方法 MyNamespace.MyClass.prototype={myMethod:function(param1...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用构造函数 } MyNamespace.Intern.prototype...Employee的三个 接口 与的定义方法大致相同 构造函数抛出异常 所有的方法抛出异常(只有方法签名,不提供实现) 注册接口时使用registerInterface方法 接口无法继承其他接口 接口定义

    6.2K50

    【Flutter】Dart 面向对象 ( 定义 | 继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )

    ---- 使用 extends 关键字定义子类 , 注意如果有非参数的构造函数, 子类必须实现相同参数的构造函数 ; // 继承 class Student extends Person{ Student...String school; String city; String address; // 如果有非参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有.../ 构造方法 : 如果没有默认构造方法 (无参构造方法) , // 必须在初始化列表调用构造函数 , super(name, age) ; // 构造方法方法体...; String city; String address; // 如果有非参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有 , 那么先调用构造方法...// 不同的初始化实例变量之间使用逗号隔开 // 构造方法 : 如果没有默认构造方法 (无参构造方法) , // 必须在初始化列表调用构造函数

    1.9K00

    第二十八节:Java基础-进阶继承,抽象,接口

    函数名,参数列表都要一样 子构造函数的特点 在子类和中都有构造函数,运行时,先执行构造函数,在执行子类的构造函数,因为子类的所有构造函数第一行都有一句,隐式的super();,...在子类为什么有super()呢,子类会一旦继承,会继承的内容,子类在初始化的时候,会先到进行的初始化操作,这没问题吧,因为这样才可以使用的内容。...子类中所有的构造函数,都会访问默认的函数。...在构造函数,第一行默认都是super(),所有对象的都是Object,所以构造函数默认第一行,除非自己写,否则都是隐式的super(),用来访问构造函数。...接口 接口解决了多继承问题,将多继承的这种机制在java通过接口实现了,接口与接口之间是继承的关系。

    35430

    关于Java构造函数(Constructor)的常见问题总结1 为什么调用子类的构造方法的时候,默认会调用构造方法2 常见错误:Implicit super constructor is und

    这篇文章总结了Java使用构造函数中最常遇到的五个问题!...这就是为什么我们上面的那个例子程序会先调用super的构造方法。 但要切记,** 虽然调用了构造方法,但只创建了一个对象也就是子对象。...编译器错误是因为默认的super()无参的构造函数是没有定义的。在Java,如果一个没有定义构造函数,编译器会自动插入一个默认的无参的构造函数。...解决这个问题很简单,我们可以给插入一个无参的构造函数,或者在子类构造函数显示的调用的有参构造函数。 在子类的构造函数显示的调用构造函数 下面的代码是正确的。 ?...为什么Java在一个已经实现了一个带参的构造函数的时候,不实现默认的无参构造函数? 这是个很有趣的问题

    2.9K41

    java关于继承问题

    https://blog.csdn.net/sinat_35512245/article/details/53767724 先来看一道面试题: java关于继承的描述正确的是() A、一个子类只能继承一个...B、子类可以继承构造方法 C、继承具有传递性 D、一般具有通用性,子类更具体 正确答案: A C D ---- 子类不可以继承构造方法,只可以调用构造方法。...子类中所有的构造函数都会默认访问参数构造函数,这是因为子类的构造函数内第一行都有默认的super()语句。super()表示子类在初始化时调用参数的构造函数来完成初始化。...一个都会有默认的参数的构造函数,若指定了带参构造函数,那么默认的参数的构造函数,就不存在了。这时如果子类的构造函数有默认的super()语句,那么就会出现错误,因为没有空参数的构造函数。...因此,在子类默认super()语句,在无对应的构造函数,必须在子类的构造函数通过this或super(参数)指定要访问的构造函数。 PS:方法没有继承一说,只有重载和重写

    1.5K00

    【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )

    student):super(student.name, student.age); 构造函数 : 如果没有默认构造函数, 子类必须调用构造函数 ; 方法体 : 命名构造方法与普通构造函数一样...age"; } } // 继承 class Student extends Person{ // 命名构造方法 // 定义格式 : 名.方法名() // 构造函数 : 如果没有默认构造函数...school; String city; String address; // 构造函数调用 : 如果有非参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有..., 那么先调用构造方法 , 完成的初始化 // 然后才能完成自己的初始化 // // this.school 指定自有参数 // {this.school} 是可选参数, 可选参数必须在构造函数参数列表中最后一个...// 必须在初始化列表调用构造函数 , super(name, age) ; // // 构造方法方法体 : 可以省略 ; Student(this.

    95300

    Java|继承学习总结

    两者在某一只能出现一次,且必须在构造方法的第一行. 继承与子类的构造方法 1.父子构造均无参数 在调用子类实例化时,会自动调用构造方法。...str){ System.out.print1n("无参构造函数"); } } 2)需要继承有参构造方法,在子类中直接调用 super(构造函数参数列表); (注意事项:必须在子类构造方法的调用...4.Java继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个,多重继承就是,例如 A 继承 B ,B 继承 C ,所以按照关系就是 C 是 B ,B 是 A ...在该方法不需要有方法体,只需要有个方法名,这种方法就称为抽象方法.Java中提供了专门的修饰符,来修饰抽象方法. ?...理解:调用抽象的抽象方法,没有具体的方法体,没有意义。 2.抽象,可以有构造方法,在子类创建对象时,会自动调用。 理解:子类实例化时原本就会调用构造方法,在抽象中一样适用。

    46030

    写给Java后端的ReactJS快速入门教程-ES6的class关键字

    相关源码地址 使用 class 声明创建一个基于原型继承的具有给定名称的新。...语法 class name [extends] { // class body } 声明一个 在下面的例子,我们首先定义一个名为Polygon的,然后继承它来创建一个名为Square的。...注意,构造函数中使用的 super() 只能在构造函数中使用,并且必须在使用 this 关键字前调用。...才可以哦,这在 Java 也是一样的:如果一个子类通过extends 关键字继承,那么,在子类的constructor 构造函数,必须优先调用一下super()。...super是一个函数,而且它是构造器,子类的super, 其实就是,constructor 构造器的一个引用。

    33610

    【前端词典】继承

    与原型 讲 ECMAScript 继承的概念之前,我先说下的概念。(如果接触过 Java 或者是 C++ 的话,我们就知道 Java(C++)的继承都是基于继承)。...小结 基于构造函数,没有使用原型链 子对象和对象公用一个原型对象 三、借用构造函数法 此方法可以解决原型引用类型值被修改的问题 function staff(){ this.test = [1,2,3...五、原型式继承 - Object.create() 利用一个临时性的构造函数对象)作为中介,将某个对象直接赋值给构造函数的原型。...缺点(同原型式继承): 原型引用类型值会被修改 无法传递参数 七、寄生组合式继承(推荐) 该方法主要是解决组合继承调用两次超构造函数问题。...子类必须在 constructor 方法调用 super 方法,否则新建实例时会报错。这是因为子类没有自己的 this 对象,而是继承的 this 对象,然后对其进行加工。

    60070

    java学习与应用(3.3)--异常、多线程、lambda简

    发生异常时,JVM创建异常对象,没有try catch则发送给方法的调用者main,main方法提交到JVM处理,JVM打印并终止java程序。...Objects工具的非静态方法:requireNonNull方法,自动判断值是否为然后抛出异常。 throws将异常对象抛出(throw)给方法的调用对象。...异常为Exception或子类,抛出时候有子关系只声明。返回上级后的函数仍然需要抛出异常声明。...自定义异常,继承Exception(编译期异常)或RuntimeException(运行期异常),然后定义构造方法,和带字符串参数的构造方法,调用的对应方法。 并行与并发 ?...改变线程名称:使用setName方法,或者使用带参数构造方法继承初始化创建设置。暂停线程Thread的静态方法sleep(单位为毫秒),添加异常处理使用。

    63920

    面试官问我:创建线程有几种方式?我笑了

    前言 多线程在面试基本上已经是问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面。 比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等。...然后,再说面试怎样回答面试官的问题比较合适。 1、继承 Thread 通过继承 Thread ,并重写它的 run 方法,我们就可以创建一个线程。...然后创建 Runnable 实现对象,并把它作为 target 传入 Thread 的构造函数 最后调用 start 方法启动线程。 ?...然后,对象 Thread ,在构造方法传入了一个 Runnable 接口的实现,实现了 run 方法。...若假设子类没有实现 run 方法,那么就会去寻找 run 方法,而的 run 方法会判断是否有 Runnable传过来(即判断target是否为),现在 target 不为,因此就会执行

    4.1K10

    Dart学习笔记

    变量定义 Dart,不像其他语言存在基本类型与类型,Dart中所有类型(包括int等)都是继承自Object的类型 字符串字符为UTF16编码,小数都为double类型,函数类型为Function,...void main(){} 构造函数 Dart的可以被继承(extends),也可以被实现(implements) Dart也提供复杂结构类型的定义语法,通过class关键字 成员定义语法为...[static] type variable,被static修饰成员代表静态成员,是共享变量 除了可以使用默认的同名无返回值函数作为构造函数,还可以定义 名.xyzxxx格式的无返回值函数作为构造函数.../ 抽象 Dart通过extends关键字进行继承,Dart允许通过mixin实现伪多继承 继承构造 子类构造函数默认继承构造函数(隐式调用) 通过在子类构造函数形参列表后使用:可以修改要使用的构造函数...mixin继承 mixin继承解决多继承同名同类型成员冲突的规则是,如果当前,包含该同名同类型成员,则使用当前成员,否则使用离with关键字最优、实现了该同名同类型成员的的成员,比如 class

    1.1K30

    ECMAScript继承详解(Java对比学习)

    #name) // -> SyntaxError 构造函数 二者同: 如果声明一个一个的时候没有声明构造函数,那么会默认添加一个构造函数构造函数在new实例化一个对象的时候会被调用 二者异...继承过程构造函数: ES6,子类,super方法是必须调用的,因为子类本身没有自身的this对象,需要通过super方法拿到的this对象。...在子类,没有构造函数,那么在默认的构造方法内部自动调用super方法,继承的全部属性,子类的构造方法,必须先调用super方法,然后才能调用this关键字声明其它属性。...如果构造器带有参数,则必须在子类的构造显式地通过 super 关键字调用构造器并配以适当的参数列表。...即使在创建后修改构造函数上的原型对象仍然不会有任何问题

    42810

    转向Kotlin——和接口

    的声明 和Java没有什么两样,Kotlin的声明也使用class关键字,如果只是声明一个,Kotlin和Java没有任何区别,不过定义的其他成员,区别就很大了。...Kotlin的,除了可以声明一个主构造器之外,还可以声明若干个第二构造器,第二构造器必须在声明,前面必须加constructor关键字。...继承 1、如何继承Java不同,Kotlin继承需要使用冒号(:),而Java使用extends。注意,冒号后面需要调用构造器。...Kotlin和Java一样,都是单继承的,也就是说,一个Kotlin只能有一个。...:实现接口与继承类似,使用冒号(:),但后面不是调用构造方法,而是是指跟接口名;Kotlin的接口的方法,允许包含默认方法体,对于这样的额方法,子类实现接口时不一定必须实现该方法。

    93030

    Java虚拟机 - 超级详细的加载说明

    所以我们继续带着问题看源码,查看加载器的的话是调用getParent()方法,所以可以在对应的找该方法,发现在这几个,只有ClassLoader存在getParent方法。 ?...接下来查看AppClassLoader、ExtClassLoader是如何被创建的。其实就是在Launcher()构造函数。 ?...先看第一个红框,ExtClassLoader的创建 ? 跟到底后发现,调用了ClassLoader中外部传入加载器的构造函数。 ?...AppClassLoader也调用了ClassLoader中外部传入加载器的构造函数,并且这里的parent变量其实就是前一行刚创建出来的ExtClassLoader。...· 双亲委派 终于来了 面试问 前面看了这么多加载器被创建出来的过程铺垫,其实就是为了证明被加载时是需要经过双亲委派的。

    46720

    Java企业面试——Java基础

    重写Override表示子类的方法可以与的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类的定义方法,这相当于把定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现...抽象定义抽象方法必须在具体子类实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象的所有抽象方法,那么子类也必须定义为abstract类型。...一个可以实现多个接口,但只能继承一个抽象。 1.3 创建线程有几种不通的方式?...l 自定义继承Thread方式 l 自定义实现Runnable接口方式 1.4 Java集合框架的基本接口有哪些?...懒汉模式 public class Single { //私有构造函数 private Single(){} //在本类创建本类对象 private static Single instance =

    77140

    【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )

    文章目 一、Flutter 组件简介 二、Flutter 自定义 StatelessWidget 组件流程 1、导入包 2、选择继承 3、设置成员变量及构造函数 4、重写 build 方法...自定义组件需要继承 StatefulWidget 或 StatelessWidget , 这两个组件都在 material.dart , 因此这里先把依赖导入 ; import 'package...age; /// Dart 构造函数 , {} 内的是可选参数 , 可选参数必须在参数的最后 /// 这里注意 , 可选参数如果定义为非类型 , 那么必须有一个默认值 ///...age; /// Dart 构造函数 , {} 内的是可选参数 , 可选参数必须在参数的最后 /// 这里注意 , 可选参数如果定义为非类型 , 那么必须有一个默认值 ///...age; /// Dart 构造函数 , {} 内的是可选参数 , 可选参数必须在参数的最后 /// 这里注意 , 可选参数如果定义为非类型 , 那么必须有一个默认值 ///

    1.8K10
    领券