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

在java中,为什么总是子类调用超类构造函数?我想要内部流程

在Java中,子类调用超类构造函数的原因是为了确保在创建子类对象时,超类的初始化工作能够得到正确执行。当一个子类继承自一个超类时,子类会继承超类的属性和方法,但是超类的构造函数不会被继承。

在Java中,每个类都必须有一个构造函数来初始化对象。如果在子类中没有显式地定义构造函数,Java会默认提供一个无参的构造函数。当创建子类对象时,子类的构造函数会隐式地调用超类的无参构造函数,以确保超类的初始化工作得以完成。

然而,如果超类中没有无参构造函数,而是定义了带参数的构造函数,那么子类就必须显式地调用超类的构造函数,并传递相应的参数。这可以通过使用super()关键字来实现,super()必须作为子类构造函数的第一条语句出现。

通过调用超类的构造函数,子类可以确保超类的属性和状态正确地初始化,从而避免潜在的错误和不一致性。这种方式也符合面向对象编程的原则,即子类应该能够完全替代超类,并且在创建子类对象时,应该保证超类的初始化工作得以执行。

总结起来,子类调用超类构造函数的目的是为了确保超类的初始化工作能够得到正确执行,避免潜在的错误和不一致性。这是Java中面向对象编程的一部分,也是保证代码正确性和可维护性的重要机制之一。

关于Java中子类调用超类构造函数的更多信息,您可以参考腾讯云的Java开发者文档:Java开发者文档

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

相关·内容

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

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

6.1K10

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

编译器错误是因为默认的super()无参的构造函数是没有定义的。Java,如果一个没有定义构造函数,编译器会自动插入一个默认的无参的构造函数。...上一小节,我们知道,如果子类构造函数,没有显示的调用构造函数,那么,编译器就会插入super(),也就是自动调用无参的构造函数。但是此时,父没有无参的构造函数,所以就会报错了。...解决这个问题很简单,我们可以给父插入一个无参的构造函数,或者子类构造函数显示的调用的父有参构造函数子类构造函数显示的调用构造函数 下面的代码是正确的。 ?...Paste_Image.png 构造函数的使用规则 简单的说,使用的时候,子类构造函数必须调用构造函数,不管有没有显示的声明。所以,被调用的父构造函数,一定在定义好!...为什么Java一个已经实现了一个带参的构造函数的时候,不实现默认的无参构造函数? 这是个很有趣的问题。

2.5K30

Java基础:继承

因此设计的时候,应该将通用的方法放到,而将具有特色用途的方法放在子类,这种将通用的功能放到的做法,面向对象程序设计十分普遍。...使用 super 调用构造器的语句必须是子类构造器的第一条语句。 3. 继承初始化过程 继承关系子类具有父相同的行为,当子类调用方法时,如何确保父的实例域是正确初始化的?...这种方式很重要,因为导出的 static 初始化可能会依赖于基成员能否被正确初始化。 基构造总是导出构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基构造器都能得到调用。...Object是所有的的基Java会自动导出构造插入对基构造器的调用(调用的实例构造器)。 4. 继承的分类 根据继承的特性可以分为纯继承与扩展。...从以上可知:创建子类对象时,并非在内部也创建一个父对象,只是调用的实例构造器来正确的初始化对应的父状态。 8.

54910

Swift vs. Kotlin 漫谈系列之类与继承

如果想要让某个可以被继承,必须要现式的为该类添加 open 的关键字,该关键字提供了和 Java final 相反的功能。 Swift: ?,为什么要区分?...构造函数的覆盖也是一样的,子类覆盖父初始化器的步骤: 初始化子类的所有成员变量 用 super 调用的初始化器 一些额外的操作 class SomeClass: BaseClass { let... Kotlin ,如果一个从它的直接继承相同成员的多个实现(由于接口函数可以有实现),它必须覆盖这个成员并提供其自己的实现。...,所以初始化块可以随意访问主构造函数的参数。...如果想要让某个可以被继承,必须要现式的为该类添加 open 的关键字,该关键字提供了和 Java final 相反的功能。

3.6K40

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

组合,新 Cat 访问旧 Animal 的属性需要通过内嵌的旧对象来调用,而对于继承来说,「新子类)可以直接调用(父)的公有属性」。UML 图如下: ?...,这个同 this 关键字一样,「使用 super调用构造函数的语句必须是子类构造函数的第一条语句」。...❝「如果子类构造器没有显式地调用构造器, 则将自动地调用默认的构造函数(无参构造函数)」。...如果没有无参构造函数, 并且子类构造又没有显式地调用的其他构造器,则 Java 编译器将报告错误。 ❞ 需要注意的是:「父构造函数总是先于子类构造函数执行」。...Java 的单继承 深入学习 Java 之前,学的其实是 C++,而 C++ 是支持多继承的,也就是说 A 可以同时继承 B 和 C 甚至更多。

83120

Java基础系列1:Java面向对象

面向对象与面向过程: 1、面向过程: 面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,一步一步的具体步骤再按顺序调用函数。 ?...Java的继承通过extends关键字来实现,实现继承的被称为子类,被继承的被称为父,有的也称其为基。父子类的关系,是一种一般和特殊的关系。...大部分时候,子类总是以父为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父的方法。...: super(参数):调用的某一个构造函数(应该为构造函数的第一条语句)。...this(参数):调用本类另一种形式的构造函数(应该为构造函数的第一条语句)。

44810

Java核心技术 卷I:基础知识》读书笔记

4.3.3 剖析 一般建议实例域采用private来维持封装 4.3.4 构造器 C++构造函数,没有看到有什么不同的 PS:Java的所有对象都是构造的,容易遗漏new操作符 PPS:不要在构造定义与实例域重名的局部变量...PS:实际应用不要依赖finalize方法,因为实际很难知道具体什么时间会调用这个函数 4.7 包 Java允许使用包将组织起来,有点类似C++的namespace 4.7.1 的导入 导入的方式...PS:很多人认为,抽象包含具体方法是有害的。、 5.1.7 如果希望的某些部分被子类访问,应该设为protected而非private。...6.3 接口与回调 callback是一种常见的程序设计模式,一般js见的比较多,或者说C++函数指针,某个事件发生后,直接调用指定的这个可变的函数。...当然,只有内部类可以声明为static。静态内部类不存在对生成它的外围的引用,其他完全一样。静态方法构造内部类必须为静态内部类。

54720

知识点总结:Java核心技术(卷1)

this的用途 1、引用隐式参数; 2、调用该类的其他的构造器; super的用途 1、调用的方法; 2、调用构造器; 子类 子类 子类构造器 使用super...调用构造器的语句必须是子类构造器的第一条语句; 如果子类构造器没有显式调用构造器,将自动地调用的默认构造器(没有参数的构造器) 如果子类构造器没有显式的调用构造器,又没有不带参数的构造器...,Java编译器将报告错误 类型转化 只能在继承层次内进行类型转化; 转化为子类之前,应该使用instanceof进行检查; 只有使用子类特有方法的时候才需要类型转换 一般情况下,应该尽量少用类型转换和...函数式接口:只有一个抽象方法的接口 java,lambda表达式所能做的也只是能转换为函数式接口。...当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷 内部类既可以访问自身的数据域,也可以访问创建它的外围对象的数据域。

32430

Dart的语法详解系列篇(二)-- 函数八、Dart的函数

默认构造函数没有参数,并在调用无参数构造函数。 如果定义了空参构造,再去写实参构造,会报错(这一点和java不一样)。...{y}'); } } 构造函数不是继承的,也就是说的命名构造函数不会被子类继承。如果希望使用定义的命名构造函数创建子类,则必须在子类实现该构造函数。...{y}'); // } } 6.构造函数调用流程 默认情况下,子类构造函数调用的无参构造函数构造函数构造函数体的开头被调用。如果 还使用初始化列表,则在调用之前执行。...执行顺序如下: 初始化列表 -> 的无参数构造函数 -> 主的无参数构造函数 必须要有一个空参构造,如果没有未命名的无参数构造函数,则必须手动调用的一个构造函数。...factory是实现不总是创建其的新实例的构造函数时使用关键字。

2.8K30

Java知识面试题复习(三)Java面向对象

对于Java而言,它多态的实现机制遵循一个原则:当对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是定义过的,也就是说被子类覆盖的方法...Java定义一个不做事且没有参数的构造方法的作用 Java程序执行子类构造方法之前,如果没有用super()来调用特定的构造方法,则会调用“没有参数的构造方法”。...因此,如果父只定义了有参数的构造方法,而在子类构造方法又没有用super()来调用特定的构造方法,则编译时将发生错误,因为Java程序找不到没有参数的构造方法可供执行。...解决办法是里加上一个不做事且没有参数的构造方法。 调用子类构造方法之前会先调用没有参数的构造方法,其目的是? 帮助子类做初始化工作。 一个构造方法的作用是什么?...对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的 为什么 Java 只有值传递 首先回顾一下程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。

35430

Java基础知识面试题(2020最新版)

变量与方法成员变量与局部变量的区别有哪些Java定义一个不做事且没有参数的构造方法的作用在调用子类构造方法之前会先调用没有参数的构造方法,其目的是?一个构造方法的作用是什么?...  3、引用父构造函数  super(参数):调用的某一个构造函数(应该为构造函数的第一条语句)。...,super()子类调用构造方法,this()本类内调用本类的其它构造方法。...对于Java而言,它多态的实现机制遵循一个原则:当对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是定义过的,也就是说被子类覆盖的方法...Java定义一个不做事且没有参数的构造方法的作用  Java程序执行子类构造方法之前,如果没有用super()来调用特定的构造方法,则会调用“没有参数的构造方法”。

44631

Java基础知识面试题(2020最新版)

变量与方法成员变量与局部变量的区别有哪些Java定义一个不做事且没有参数的构造方法的作用在调用子类构造方法之前会先调用没有参数的构造方法,其目的是?一个构造方法的作用是什么?...  3、引用父构造函数  super(参数):调用的某一个构造函数(应该为构造函数的第一条语句)。...,super()子类调用构造方法,this()本类内调用本类的其它构造方法。...对于Java而言,它多态的实现机制遵循一个原则:当对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是定义过的,也就是说被子类覆盖的方法...Java定义一个不做事且没有参数的构造方法的作用  Java程序执行子类构造方法之前,如果没有用super()来调用特定的构造方法,则会调用“没有参数的构造方法”。

32510

Java基础知识面试题(2020最新版)

变量与方法 成员变量与局部变量的区别有哪些 Java定义一个不做事且没有参数的构造方法的作用 调用子类构造方法之前会先调用没有参数的构造方法,其目的是? 一个构造方法的作用是什么?...3、引用父构造函数 super(参数):调用的某一个构造函数(应该为构造函数的第一条语句)。...,super()子类调用构造方法,this()本类内调用本类的其它构造方法。...对于Java而言,它多态的实现机制遵循一个原则:当对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是定义过的,也就是说被子类覆盖的方法...Java定义一个不做事且没有参数的构造方法的作用 Java程序执行子类构造方法之前,如果没有用super()来调用特定的构造方法,则会调用“没有参数的构造方法”。

90430

Java——Java面向对象

面向对象与面向过程: 1、面向过程: 面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,一步一步的具体步骤再按顺序调用函数。 ?...大部分时候,子类总是以父为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父的方法。...: super(参数):调用的某一个构造函数(应该为构造函数的第一条语句)。...this(参数):调用本类另一种形式的构造函数(应该为构造函数的第一条语句)。...如果在子类定义某方法与其父有相同的名称和参数,我们说该方法被重写 (Overriding)。Java子类可继承父的方法,而不需要重新编写相同的方法。

2.2K20

CodeQL初识 — java分析的简单学习

它们的共同是 Element,它提供了通用的成员谓词来确定程序元素的名称并检查两个元素是否相互嵌套。 引用可能是方法或构造函数的元素通常很方便。...Array 表示 Java 数组类型。 引用类型也根据其声明范围进行分类: TopLevelType 表示在编译单元的顶层声明的引用类型。 NestedType 是另一个类型声明的类型。...NestedClass 表示另一个类型声明的,例如: LocalClass,它是方法或构造函数声明的。 AnonymousClass,这是一个匿名。...因此,有满足这些特殊情况的三个子类: Field 表示一个 Java 字段。 LocalVariableDecl 表示一个局部变量。 Parameter 表示方法或构造函数的参数。...的内部处理机制流程

52310

【前端词典】继承

这些方法都以事先内置 JavaScript ,直接调用即可。上面标红了两个特别的属性 constructor 和 __proto__。这两个属性接下来都会讲。...听到有人在问为什么? 因为这个 __proto__.constructor 指向的是 Object。 我们知道:一个函数的原型对象的构造函数是这个函数本身。...缺点(同原型式继承): 原型引用类型值会被修改 无法传递参数 七、寄生组合式继承(推荐) 该方法主要是解决组合继承调用两次构造函数的问题。...ES6 的继承机制完全不同,实质是先创造父的实例对象 this (所以必须先调用 super() 方法),然后再用子类构造函数修改 this。...__proto__ = superType; }} 由此可以看出: 子类的 __proto__ 属性,表示构造函数的继承,总是指向父

58170

【2022最新Java面试宝典】—— Java基础知识面试题(91道含答案)

Java定义一个不做事且没有参数的构造方法的作用 44. 调用子类构造方法之前会先调用没有参数的构造方法,其目的是? 45. 一个构造方法的作用是什么?...super(参数):调用的某一个构造函数(应该为构造函数的第一条语句)。...,super()子类调用构造方法,this()本类内调用本类的其它构造方法。...对于Java而言,它多态的实现机制遵循一个原则:当对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是定义过的,也就是说被子类覆盖的方法...Java定义一个不做事且没有参数的构造方法的作用 Java程序执行子类构造方法之前,如果没有用super()来调用特定的构造方法,则会调用“没有参数的构造方法”。

54330

Effective-java-读书笔记之类和接口

): 缺省(default)访问级别, 声明该成员的包内部的任何都可以访问这个成员.受保护的(protected): 声明该成员的子类和包内部的任何可以访问这个成员.公有的(public).如果覆盖了的一个方法..., 子类的访问级别就不允许低于的访问级别....因此, 子类必须要跟着其的更新而演变, 除非是专门为了扩展而设计的, 并且有很好的文档说明.例子: 覆写了HashSet的add和addAll方法, 但其实后者调用了前者.组合(composition...因此必须在发布之前先编写子类进行测试.为了允许继承, 还必须遵守其他一些约束.构造器决不能调用可被覆盖的方法. 无论是直接调用还是间接调用....(因为构造子类构造器之前运行, 如果子类覆盖版本的方法依赖于子类构造器所执行的任何初始化工作, 该方法将不会如预期般地执行.)在为了继承而设计的时候, Cloneable和Serializable

65471

JAVA基础(38) java四大特性理解(封装、继承、多态、抽象)

子父构造方法的特点:    子类构造对象时,发现,访问子类构造函数时,父也运行了。 原因:    子类构造方法的第一行有一个默认的隐士语句。...super();调用的空参数构造函数。...fly()方法,则只需子类fly()方法中加上如下代码即可: super.fly(); 注意:super和this一样,都不能出现在static的方法 调用构造器 1、看如下程序定义的...Basehe Sub,其中Sub是Base子类,程序Sub构造器中使用super来调用Base构造器里的初始化代码。...extends Base{ public String color; public Sub(double size, String name, String color){ //子类构造调用构造

1.7K20
领券