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

Java中的继承 - 创建子类的对象也会调用超类的构造函数.为什么呢?

在Java中,继承是一种关系,它允许一个类(子类)从另一个类(父类)继承属性和方法。当创建子类的对象时,子类的构造函数会调用父类的构造函数,以确保父类的属性和方法能够被正确地初始化。这是因为子类继承了父类的属性和方法,所以在创建子类对象时,需要确保父类的属性和方法能够正常工作。

子类的构造函数可以通过super()关键字显式地调用父类的构造函数。如果子类没有显式地调用父类的构造函数,则编译器会自动在子类的构造函数中添加一个调用父类构造函数的语句,这个语句就是super()

例如,假设有一个父类Animal和一个子类Dog,父类Animal有一个构造函数Animal(String name),子类Dog有一个构造函数Dog(String name, String breed)。当创建一个Dog对象时,子类的构造函数会调用父类的构造函数,即super(name)。这样可以确保Animal类的属性和方法能够被正确地初始化。

总之,子类的构造函数会调用父类的构造函数,以确保父类的属性和方法能够被正确地初始化。这是Java中继承的一个重要特性,可以帮助开发人员更好地管理和维护代码。

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

相关·内容

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

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

6.2K10

java之父类中的构造器是否能被子类继承?

子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器。子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父类的空构造器。...如果父类的构造器被重载,那么子类中的构造器也必须初始化父类的构造器,否则会报编译错误。当然,只要父类中显示定义了空构造器,子类中就不必初始化父类的构造器。...:Student.java package myjava; public class Student extends Person{ //这里必须初始化父类重载后的构造方法,否则会报错...System.out.println(personName); System.out.println(studentName); } 输出: tom jack 说明:此时父类中没有显示定义空构造器...,只有一个重载了的构造器,在子类构造器中,必须初始化父类的构造器,即super关键字+父类构造器中的参数。

1.2K20
  • 【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 的 成员变量 , 那么 该类 的 构造 与 析构 , 就需要涉及到...类 本身 的 构造函数 和 析构函数 , 父类 的 构造函数 和 析构函数 , 类 成员变量 的 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下...析构函数 ; 最后 , 调用 父类 析构函数 ; 二、完整代码示例分析 ---- 1、代码分析 在下面的代码中 , 继承关系 : C 类 继承了 B 类 class C : public B , B 类...继承了 A 类 class B : public A ; 组合关系 : D 类 是一个普通类 , 在 C 类中维护了一个 D 类成员变量 ; class C : public B { public:...函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到的 父类构造/析构函数 , 自身构造/析构函数

    20510

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

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...// 父类对象 可以调用 父类公有函数 parent.funParent(); // 子类对象 可以调用 子类自身公有函数 child.funChild();...// 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer...// 通过父类指针调用父类函数 p_parent->funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer

    30920

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

    这就是为什么我们上面的那个例子程序会先调用super的构造方法。 但要切记,** 虽然调用了父类的构造方法,但只创建了一个对象也就是子对象。...编译器错误是因为默认的super()无参的构造函数是没有定义的。在Java中,如果一个类没有定义构造函数,编译器会自动插入一个默认的无参的构造函数。...解决这个问题很简单,我们可以给父类插入一个无参的构造函数,或者在子类构造函数中显示的调用的父类有参构造函数。 在子类的构造函数中显示的调用父类的构造函数 下面的代码是正确的。 ?...为什么Java在一个类已经实现了一个带参的构造函数的时候,不实现默认的无参构造函数? 这是个很有趣的问题。...我们知道如果在一个类中没有声明一个构造函数,那么编译器会隐式的帮我们实现一个无参的构造函数,但如果我们一旦一个构造函数,不管带不带参数,那么编译器都不会提供默认的构造函数,所以这么做的原因是为什么呢?

    3K41

    【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )

    一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) 中 , 介绍了 三种类型的 构造函数 , 并在 main 函数中 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了...栈内存中的 变量 Student s1 ; 这些都是在 栈内存 中创建 类的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存中的实例对象销毁 ; 栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1...; Student* s2; 在 C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码中 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数

    18920

    深入理解javascript中的继承机制(2)临时构造函数模式Uber – 从子对象调用父对象的接口将继承部分封装成函数

    为了解决前文提到的将共有的属性放进原型中这种模式产生的子对象覆盖掉父对象同名属性的问题,就出现了另一种模式,我们称作为临时构造函数模式 临时构造函数模式 我们具体通过代码来分析 function Shape...F,然后将Shape构造函数的原型对象赋给F的原型。...Uber – 从子对象调用父对象的接口 传统的面向对象的编程语言都会有子对象访问父对象的方法,比如java中子对象要调用父对象的方法,只要直接调用就可以得到结果了。...,给每个构造函数天价了一个uber属性,同时使他指向父对象的原型,然后更改了Shape的toString函数,更新后的函数,会先检查this.constructor是否有uber属性,当对象调用toString...时,this.constructor就是构造函数,找到了uber属性之后,就调用uber指向的对象的toString方法,所以,实际就是,先看父对象的原型对象是否有同String,有就先调用它。

    1.6K20

    Java 小白成长记 · 第 6 篇「为什么说要慎用继承,优先使用组合」

    Java 中实现代码复用的手段有两种,标题也写的很清楚: 第一种手段:组合 第二种手段:继承 本文会先分别讲解什么是继承,什么是组合,最后再揭开标题的谜底 — 「为什么说要慎用继承,优先使用组合」。...在组合中,新类 Cat 访问旧类 Animal 中的属性需要通过内嵌的旧类对象来调用,而对于继承来说,「新类(子类)可以直接调用旧类(父类)的公有属性」。UML 类图如下: ?...❝「如果子类的构造器没有显式地调用父类的构造器, 则将自动地调用父类默认的构造函数(无参构造函数)」。...如果超类没有无参构造函数, 并且在子类的构造器中又没有显式地调用超类的其他构造器,则 Java 编译器将报告错误。 ❞ 需要注意的是:「父类的构造函数总是先于子类的构造函数执行」。...然而,「在 Java 中,子类只能继承一个父类」。也就是「单继承」。 ? 为啥 Java 和 C++ 都是面向对象的,C++ 支持多继承和 Java 却不支持呢?

    99020

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

    可重复注册命名空间,每个独立的脚本模块前都要注册命名空间以保证命名空间存在 类 定义构造函数 定义成员(方法、属性、事件) 注册类 类——构造函数 类的构造函数即为function定义 通常用于初始化域变量..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 类——继承 调用父类的构造函数 有父类的类必须调用父类的构造函数,否则会丢失继承效果...可以直接以普通方式实现父类的抽象成员 toString方法无法被继承 类——调用父类方法 MyNamespace.MyClass.prototype={myMethod:function(param1...Employee的三个类 接口 与类的定义方法大致相同 构造函数抛出异常 所有的方法抛出异常(只有方法签名,不提供实现) 注册接口时使用registerInterface方法 接口无法继承其他接口 接口定义.../如果当前 Type 在 object 表示的对象的继承层次结构中,或者如果当前 Type 是 object 支持的接口,则为 true Type.isClass Type.isInterface Type.isNamespace

    6.2K50

    Java培训实战教程之Java基础知识精华部分(四)(五)

    为什么不支持多继承呢? 因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个呢?因为父类中的方法中存在方法体。...当子父类中出现了一模一样的方法时,建立子类对象会运行子类中的方法。好像父类中的方法被覆盖掉一样。所以这种情况,是函数的另一个特性:覆盖(复写、重写) 什么时候使用覆盖呢?...而super():是在调用父类中空参数的构造函数。 为什么子类对象初始化时,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个super()?)...因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。 所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。...如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

    43530

    JS 继承的多种方法

    ,我们也不能向超类型的构造函数中传递参数。...借用构造函数 为了解决原型中包含引用类型值所带来的问题,开发人员开始使用借用构造函数的技术实现继承,该方法主要是通过apply()和call()方法,在子类型构造函数的内部调用超类型构造函数,从而解决该问题...缺点:无论什么情况下,都会调用两次超类型构造函数,一次是在创建子类型的时候,另一次是在子类型构造函数内部,子类型最终会包含超类型对象的全部实例属性,但是需要在调用子类型构造函数时重写这些属性。 4....寄生组合式继承 组合继承是js中最经常用到的一种继承方法,而我们前面也已经说了组合继承的缺点,组合继承需要调用两次超类型构造函数,一次是在创建子类型原型的时候,另一次是在子类型构造函数内部,子类型最终会包含超类型对象的全部实例属性...但是呢,使用extends实现继承的时候,还是有几点需要注意的问题,子类在继承父类的时候,子类必须在constructor方法中调用super方法,否则新建实例时会报错,这是因为子类自己的this对象,

    2.8K10

    Java中子类和父类的构造函数?

    参考链接: Java中的继承和构造函数 这篇文章总结了关于Java构造的常见​​问题。  1)为什么创建一个子类对象要也需要调用父类的构造函数? ...,构造对象时,父类中的构造函数(super())首先被调用。...如果没有,编译器会插入调用父类构造的语句。这就是为什么在创建子类对象时父类中的构造超函数会被调用。  这里没有创建两个对象,只有一个子对象。...在Java中,如果一个类没有定义构造函数,编译器会为类默认创建一个无参构造函数。如果在父类中定义了构造函数super(String s),在这种情况下,编译器将不会为类创建一个无参构造函数。...3)子类中的显式调用父类构造函数  下面的代码是正常的:    子类(Sub)构造函数显式地调用父类(Super)中的带参构造参数。如果父类中定义了相对应的构造函数,那将会被正常良好的调用。

    2.3K20

    Java基础:继承

    使用 super 调用构造器的语句必须是子类构造器的第一条语句。 3. 继承初始化过程 在继承关系中,子类具有父类相同的行为,当子类调用父类方法时,如何确保父类的实例域是正确初始化的?...只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化。因此必须令所有的构造器都得到调用,否则就不可能正确构造完整对象。这正是编译器为什么要强制每个导出类都必须调用构造器的原因。...Object是所有的类的基类,Java会自动在导出类的构造器中插入对基类构造器的调用(调用类的实例构造器)。 4. 继承的分类 根据继承的特性可以分为纯继承与扩展。...实际上只是调用父类的实例构造器,不是在子类对象上 new 一个父类对象。 从 Java 程序的视角来看,对象创建才刚刚开始 —— 方法还没有执行,所有的字段都还为零。...从以上可知:在创建子类对象时,并非在内部也创建一个父类对象,只是调用父类的实例构造器来正确的初始化对应的父类状态。 8.

    57910

    Java Review (十、面向对象----继承)

    这个关键字很好地体现了子类和父类的 系:子类是对父类的扩展,子类是种特殊的父类 从这个意义上来看,使用继承来描述子类和父类的似乎不如扩展更恰当。 为什么国内把 extends 翻译为"继承"呢?...量,则会发生子类实例变量隐藏父类实例变量的情形,在子类定义的实例方法中可以通过 super 来访问父类中被隐藏的实例变量 当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为,...调用父类构造器 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。...如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。...如果父类没有不带参数的构造器, 并且在子类的构造器中又没有显式地调用超类的其他构造器则 Java 编译器将报告错误。

    50630

    JavaScript面向对象程序设计之继承(一)

    JavaScript是一种弱类型的语言,没有类的概念,也不是一种面向对象的语言。但是,在JavaScript中,借助函数的原型(也就是prototype)可以实现类的功能。...因此,显然,当我们使用原型链实现继承时,我们不仅继承了超类型实例的原型中的公有属性,也继承了其构造函数中定义的私有属性。并且本应该是私有的属性,却因为它成了子类型的原型,而变成了子类型的公有属性。...另外,在SubType构造函数中,调用SuperType构造函数时,子类型可以给超类型传递参数。 借用构造函数看似简单,却解决了原型链式继承中存在的两个让人头疼的问题。...也许你会进行一些尝试,我给超类型的原型定义公共方法行不行呢?我直接在超类型构造函数上定义一个方法行不行呢?...,并将其属性的执行环境绑定到子类型上,因此子类型在执行完超类型构造函数那一刻,子类型和超类型之间就切断了联系,子类型的实例又怎么可能访问到超类型的原型方法呢。

    36210

    为什么不允许使用 Java 静态构造函数?

    不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么。...[zhtwu6wcpq.png] 静态属于类,构造函数属于对象 我们知道静态方法,静态块或变量属于该类。而构造函数属于该对象,并在使用 new 运算符创建实例时调用。...在Java中,每个类都隐式扩展了对象类。...我们可以定义一个类层次结构,其中子类构造函数调用超类构造函数。这是通过super()方法调用完成的。大多数情况下,JVM自动调用超类构造函数,但有时如果超类中有多个构造函数,我们必须手动调用它们。...因此,如果构造函数转换静态,我们将无法使用它,这将破坏java中的继承性。 正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。

    3.1K80

    《Java从入门到失业》第五章:继承与多态(5.1-5.7):继承

    不过在Java中,我们一般习惯用超类和子类的方式来称呼。...Must define an explicit constructor 意思是超类没有隐式的定义默认构造函数Gun(),AWM类必须显式的定义构造器。这是因为子类在构造的时候,必须要同时构造超类。...要么显式的在子类构造器调用超类构造方法,否则编译器会自动的在子类构造器第一句话调用超类的默认构造器。   ...为了不报错,那么就必须在构造AWM的时候,调用Gun新增的带参数的构造器,为此,我们也编写一个带参数的AWM构造器,那么如何在子类中调用超类的构造器呢?使用super关键字。...在Java中,我们把这种子类对象赋值给超类变量的操作称为向上转型。向上转型是安全的。

    57520

    Java中对象的生与灭- 核心篇

    Java的三大特性,其中介绍了类的继承、重载等,这里我们就基于这些知识点,把对象的创建和回收进行一个简单的介绍 这篇不是很长,只是介绍核心的几个知识点,相信大家很快就可以看完,真的 目录 堆和栈 构造函数...有参构造函数 构造函数和普通方法的区别: 构造函数没有返回类型 构造函数名与类名一致 关于编译器的默认操作: 如果没有定义构造函数,编译器会默认创建一个无参构造函数 如果子类定义了有参构造函数,且没有显示调用父类的构造函数...,则直接调用super()即可调用父类对应的构造函数或方法(下面代码有演示) 构造函数的执行顺序 如果子类Dog继承父类Animal,那么会先调用父类的构造函数,再调用子类的构造函数; 如果父类Animal...最终的构造函数,会调到这里为止 } } **/ ​ 输出如下: father construct sub construct 可以看到,先调用父类Father的构造函数,再调用子类的构造函数 他们之间的继承关系如下...主要通过构造函数来创建,比如new对象 如果是反序列化来创建对象,则不会构造,因为构造后,对象的属性会被重新初始化,那么序列化的属性值就被抹掉了(前面的Java中的IO流有涉及) 如果子类有父类,则先调用父类的构造函数

    27910

    JS原型链与继承别再被问倒了

    问题一: 当原型链中包含引用类型值的原型时,该引用类型值会被所有实例共享; 问题二: 在创建子类型(例如创建Son的实例)时,不能向超类型(例如Father)的构造函数中传递参数....基本思想:即在子类型构造函数的内部调用超类型构造函数....同时我们还注意到组合继承其实调用了两次父类构造函数, 造成了不必要的消耗, 那么怎样才能避免这种不必要的消耗呢, 这个我们将在后面讲到....组合继承最大的问题就是无论什么情况下,都会调用两次父类构造函数: 一次是在创建子类型原型的时候, 另一次是在子类型构造函数内部. 寄生组合式继承就是为了降低调用父类构造函数的开销而出现的 ....“new F()”, 既然extend的目的是将子类型的 prototype 指向超类型的 prototype,为什么不直接做如下操作呢?

    62150

    JavaScript两种继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。...js可以通过构造函数和原型的方式模拟实现类的功能。 另外,js类式继承的实现也是依靠原型链来实现的。 原型式继承与类式继承 类式继承是在子类型构造函数的内部调用超类型的构造函数。...(this);} 原型式继承是借助已有的对象创建新的对象,将子类的原型指向父类,就相当于加入了父类这条原型链。...原型链继承 为了让子类继承父类的属性(也包括方法),首先需要定义一个构造函数。然后,将父类的新实例赋值给构造函数的原型。...,因此,isPrototypeof()方法也会返回true 在js中,被继承的函数称为超类型(父类,基类也行),继承的函数称为子类型(子类,派生类)。

    69530
    领券