首页
学习
活动
专区
工具
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.1K10

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:...<< "C 析构函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 对象 , 涉及到构造/析构函数 , 自身构造/析构函数

15310

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

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

20520

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

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

2.5K30

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

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

14620

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

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

1.6K20

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

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

82620

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来指定调用子类自己构造函数,那么被调用构造函数一样访问父构造函数

41630

JS 继承多种方法

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

2.8K10

Java子类和父构造函数

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

2K20

Java基础:继承

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

54710

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

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

33110

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

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

47430

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

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

3K70

Java对象生与灭- 核心篇

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

24910

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

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

55520

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

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

58650

JavaScript两种继承方式详解

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

66130
领券