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

在调用超类的构造函数之前,是否无法执行初始化?

在调用超类的构造函数之前,是无法执行初始化的。在面向对象编程中,构造函数是用于初始化对象的,当一个类继承自另一个类时,需要先调用超类的构造函数,然后才能执行子类的初始化。这是因为子类可能会依赖于超类的属性和方法,因此需要先确保超类已经被正确地初始化。

在Java中,可以使用super()关键字来调用超类的构造函数。例如:

代码语言:java
复制
public class SubClass extends SuperClass {
    public SubClass() {
        super();
        // 子类的初始化代码
    }
}

在上面的例子中,super()调用了超类SuperClass的构造函数,然后才执行了子类SubClass的初始化代码。如果没有调用super(),则会出现编译错误。

因此,在调用超类的构造函数之前,是无法执行初始化的。

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

相关·内容

JEP 447 已发布,可在构造函数的 super()调用之前执行语句

该 JEP 来自 Project Amber 项目,提议允许在构造函数的 super() 调用之前出现不引用正在创建的实例的语句,并保留构造函数现有的安全性和初始化保证。...传统上,要求 Java 构造函数将对另一个构造函数的显式调用作为第一条语句。这个约束确保了自上而下的执行顺序,并防止对未初始化字段的访问,极大地限制了构造函数逻辑的表达性和可读性。...if (value <= 0) throw new IllegalArgumentException("non-positive value"); } } 通过在调用超类构造函数之前验证其参数来声明快速失败的构造函数会更好...JEP 447 放宽了这些限制,允许在显式构造函数调用之前出现不引用正在创建的实例的语句。...以前,由于超类构造函数调用必须作为第一条语句,这就需要使用辅助方法。

19210

【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 析构函数 执行顺序 )

, B 类的 有参构造函数 , 传入了 3 个参数 , 这三个参数都不在函数体中使用 , 而是在 参数列表中使用 , // 构造函数中的参数可以作为 B(int age, int ageOfA,..., 类 A 定义了 2 个参数的 有参构造函数 ; 类 B 定义了 无参构造函数 , 但是在该 无参构造函数 中 , 定义了函数列表 B() : m_age(10), m_a(10, 150) , 在该函数列表中.../ 析构函数 执行顺序 ---- 1、构造函数 / 析构函数 执行顺序 类 B 中 定义了 A 类型 的 成员变量 ; A 类型对象 是 被组合对象 ; 构造函数执行顺序 : 在 初始化 B 类型 实例对象时..., 先执行 被组合对象 A 的构造函数 , 如果 被组合对象 有多个 , 则 按照 成员变量 的定义顺序 进行初始化 ; 注意 : 此处 不是按照 初始化列表 的顺序 进行初始化 ; 析构函数执行顺序...: 析构函数 与 构造函数 的执行顺序 相反 ; 2、代码示例 - 构造函数执行顺序 下面的代码中 , 在 B 类中定义 A 类型 成员变量 ; 执行构造函数时 , 先调用 A 的构造函数 , 再调用

26130
  • 一个对象的前世今生

    在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。...Java要求构造函数的第一条语句必须是超类构造函数的调用语句),构造函数本身的代码之前。...事实上,这一点是在构造函数中保证的:Java强制要求Object对象(Object是Java的顶层对象,没有超类)之外的所有对象构造函数的第一条语句必须是超类构造函数的调用语句或者是类中定义的其他的构造函数...this.i = i; .... } } 对于这种情况,Java只允许在ConstructorExample(int i)内调用超类的构造函数,也就是说,下面两种情形的代码编译是无法通过的...也就是说,编译器会将实例变量初始化和实例代码块初始化相关代码放到类的构造函数中去,并且这些代码会被放在对超类构造函数的调用语句之后,构造函数本身的代码之前。 ?

    48810

    深入理解Java对象的创建过程:类的初始化与实例化

    在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。...Java要求构造函数的第一条语句必须是超类构造函数的调用语句),构造函数本身的代码之前。...事实上,这一点是在构造函数中保证的:Java强制要求Object对象(Object是Java的顶层对象,没有超类)之外的所有对象构造函数的第一条语句必须是超类构造函数的调用语句或者是类中定义的其他的构造函数...this.i = i; .... } } 对于这种情况,Java只允许在ConstructorExample(int i)内调用超类的构造函数,也就是说,下面两种情形的代码编译是无法通过的...也就是说,编译器会将实例变量初始化和实例代码块初始化相关代码放到类的构造函数中去,并且这些代码会被放在对超类构造函数的调用语句之后,构造函数本身的代码之前。 ?

    3.1K51

    深入理解Java对象的创建过程:类的初始化与实例化

    在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。...Java要求构造函数的第一条语句必须是超类构造函数的调用语句),构造函数本身的代码之前。...事实上,这一点是在构造函数中保证的:Java强制要求Object对象(Object是Java的顶层对象,没有超类)之外的所有对象构造函数的第一条语句必须是超类构造函数的调用语句或者是类中定义的其他的构造函数...this.i = i;           ....       }   }      对于这种情况,Java只允许在ConstructorExample(int i)内调用超类的构造函数,也就是说,下面两种情形的代码编译是无法通过的...也就是说,编译器会将实例变量初始化和实例代码块初始化相关代码放到类的构造函数中去,并且这些代码会被放在对超类构造函数的调用语句之后,构造函数本身的代码之前。

    2.7K10

    Java虚拟机--对象的建立你的对象如何创建?

    在Java程序中,类通常是用new的形式来使用。当虚拟机遇到了一条new指令时,会在常量池中检查该类的符号引用是否能存在,并检查该类否已经被加载、解析、初始化过。...image 我们在定义(声明)实例变量的同时,可以直接对实例变量进行赋值。这种方式为实例变量进行初始化,会在构造函数执行之前完成实例变量的初始化操作。 实例代码块初始化 ?...image 从测试结果来看,当构造函数执行之前就会完成实例代码块的初始化操作。 但是,在通过查看编译后的.class文件时,我们发现示例代码块中的内容被编译到了构造函数中,所以说不存在谁先谁后。 ?...Java要求在实例化类之前,必须先实例化其超类,以保证所创建实例的完整性。...Java强制要求除了Object之外,所有对象的构造函数必须首先调用超类的构造函数---super(),如果我们显式调用超类的构造函数,或者没有显式的声明构造,那么在编译期结束后,编译器都会为我们自动生成一个对超类构造函数的调用

    1.2K60

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

    不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么。...由于构造函数不是类属性,因此有理由认为它不能是静态的。 静态块 / 方法无法访问非静态变量 我们知道静态方法不能访问非静态变量。静态块也是如此。 现在,构造函数的主要目的是初始化对象变量。...因此,如果我们将构造函数设置为静态,则无法初始化对象变量。这将破坏使用创建对象的构造函数的全部目的。因此,使构造函数为非静态是合理的。 注意,我们不能this在静态方法中使用引用对象变量。...我们可以定义一个类层次结构,其中子类构造函数调用超类构造函数。这是通过super()方法调用完成的。大多数情况下,JVM自动调用超类构造函数,但有时如果超类中有多个构造函数,我们必须手动调用它们。...请注意,我们无法将参数传递给静态块,因此,如果您要初始化静态变量,则也可以在常规构造函数中执行此操作。

    3.1K80

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

    assert(point.y == null); // Values default to null. } 如果初始化声明它的实例变量(而不是构造函数或方法),则在创建实例时设置该值,该实例在构造函数及其初始化列表执行之前...{y}'); // } } 6.构造函数调用流程 默认情况下,子类中的构造函数调用超类的无参构造函数。超类的构造函数在构造函数体的开头被调用。如果 还使用初始化列表,则在调用超类之前执行。...执行顺序如下: 初始化列表 -> 超类的无参数构造函数 -> 主类的无参数构造函数 超类必须要有一个空参构造,如果超类没有未命名的无参数构造函数,则必须手动调用超类中的一个构造函数。...在冒号(:)之后,在构造函数体(如果有)之前指定超类构造函数。 例如下面的示例:TestChild类和其超类Test类。...= (width * height)/2 { print('TestChild 有参构造'); } } 注意事项: 在调用构造函数之前会计算超类构造函数的参数,所以参数可以是一个表达式。

    3K30

    JavaScript面向对象与原型

    是创建对象比较好的方法。 原型模式,不管你是否调用了原型中的共享方法,它都会初始化原型中的方法,并且在声明一个对象时,构造函数+原型部分让人感觉又很怪异,最好就是把构造函数和原型封装到一起。...里,被继承的函数称为超类型(父类,基类也行,其他语言叫法),继承的函数称为子类型(子类,派生类)。...继承也有之前问题,比如字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。...为了解决引用共享和超类型无法传参的问题,我们采用一种叫借用构造函数的技术,或者成为对象冒充(伪造对象、经典继承)的技术来解决这两种问题。...;但,组合式继承也有一点小问题,就是超类型在使用过程中会被调用两次:一次是创建子类型的时候,另一次是在子类型构造函数的内部。

    761100

    【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑

    但是,但是,但是,如果构造快为有参构造,请记得显示调用super方法,否则父类是不能被初始化的。如果子类的构造器没有显示地调用超类的构造器,则将自动调用超类默认(没有参数) 的构造器。...如果超类没有不带参数的构造器,并且在子类的构造器又没有显式地调用超类的其他构造器,则 java 编译器将报告错误 情况四:子类和父类有同名同类型的静态常量的时候 public class Main...至于spring中观察者模式的使用,我在后续文章中会重点分享,请持续关注 3、使用场景 各种设计模式,都会以此为依托,才能有更好的设计 子类默认调用父类构造函数问题 默认情况下,子类在使用构造函数初始化时...总结:所有的case总结就这两个原则 1、子类构造器质性之前必须能够先执行父类的构造函数(super(xxx)必须放在第一行代码) 2、若父类有空构造,子类构造默认都会调用super()。...因此上面如果我们这样写static final int b=112它哪怕在准备阶段,值就应该是112了 类的初始化阶段:需要做的是执行类构造器(请注意:这里不是指的构造函数)。

    1.5K20

    Scala-8.面向对象-构造函数

    Scala类的主构造函数是以下组合: 构造函数参数 在类内部被调用的方法 在类内部执行的语句和表达式 和Java类似,类被实例化的时候它们会被赋值。...辅助构造函数必须用this为名创建 每个辅助构造函数必须从调用之前定义的构造函数开始 一个构造函数通过this调用另一个不同的构造函数 case class里添加的辅助构造函数不是构造函数,是类的伴生对象中的...定义子类构造函数时,不要用var或者val声明类间公用的字段,然后在子类中用val或者var定义新的构造函数参数。...* 调用父类的构造函数:在Scala定义子类时,可以在子类定义extends时控制被其主构造函数调用的超类构造函数。...* 辅助构造函数的第一行必须调用当前类的另一个构造函数,好久无法调用超类的构造函数

    98540

    静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑

    但是,但是,但是,如果构造快为有参构造,请记得显示调用super方法,否则父类是不能被初始化的。如果子类的构造器没有显示地调用超类的构造器,则将自动调用超类默认(没有参数) 的构造器。...如果超类没有不带参数的构造器,并且在子类的构造器又没有显式地调用超类的其他构造器,则 java 编译器将报告错误~ 变种面试题 public class StaticTest { public...因此上面如果我们这样写static final int b=112它哪怕在准备阶段,值就应该是112了 类的初始化阶段:需要做的是执行类构造器(请注意:这里不是指的构造函数)。...默认情况下,子类在使用构造函数初始化时(不管是子类使用有参构造还是无参构造),默认情况下都会调用父类的无参构造函数(相当于调用了super())。...结论: 1、子类构造器执行之前必须能够先执行父类的构造函数(super(xxx)必须放在第一行代码) 2、若父类有空构造,子类构造默认都会调用super()。

    97750

    C++期末复习

    1.基本函数 (1)构造函数,这个需要注意的就是我们如果使用类名加括号,括号里面加参数的方式这样的写法不是在调用构造函数,而是在创建一个匿名对象; using namespace std; class..., 执行主函数里面的第一行的时候就会调用cboy类里面的构造函数,执行主函数里面的第二行的时候,因为这个实参boy是一个对象,传递给形参的时候使用的是值传递,所以这个时候就会执行这个拷贝构造函数,这个构造函数就是实参的内容传递给形参...,这个时候就不会调用这个拷贝构造函数了,因为这个引用的话使用的是和实现相同的东西,只不过是找了一个别名罢了; 上面介绍的所有内容,这个超女的男朋友进行这个初始化列表的时候,并没有走这个初始化列表,相反这个是先执行构造函数...,在这个函数体里面进行初始化,这个是两个步骤; 下面我们使用初始化列表对于这个超女类的成员进行初始化操作: 这个时候我们发现当我们使用初始化列表的时候,调用的是成员类的拷贝构造函数,这个时候对象的初始化和赋值是两步操作...,使用初始化列表,对象的初始化和赋值就是一步操作; 这个时候对比之前的没有使用初始化列表的情况,显示对于这个形参执行的是普通构造函数,然后在这个构造函数体里面进行赋值,这个时候相信你就可以理解最开始的时候这句话的意思了

    3700

    Dart语言指南(二) 顶

    ,该值在构造函数和其初始化程序列表之前执行....超类的构造函数在构造函数体的起始处被调用。 如果一个 初始化器列表 也被使用,它将在超类被调用之前执行。...总而言之,执行顺序如下: 初始化程序列表 父类的无参构造 主类的无参构造 如果超类没有未命名的无参数构造函数,则必须手动调用超类中的一个构造函数。...在冒号 (:)之后,在构造函数体(如果有的话)之前指定超类构造函数. 下面的例子中,Employee类的构造函数调用了其父类Person的命名构造函数....Initializer list 除了调用超类构造函数之外,还可以在构造函数体运行之前初始化实例变量,用逗号分隔初始化器. class Point { num x; num y; Point

    3.1K20

    Java反射原理

    而初始化时执行的是()方法,我们可以编写静态代码块来验证此类是否初始化了。 初始化阶段就是执行类构造器()方法的过程。...* 如果name表示数组类,则该数组类的组件类型已加载但未初始化。 * 请注意,此方法会引发与加载,链接或初始化有关的错误 * 请注意,此方法不会检查其调用者是否可以访问所请求的类。...对象表示的构造函数,使用指定的初始化参数创建和初始化构造函数的声明类的新实例。...* 如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭实例 * 如果所需的访问和参数检查成功,并且实例化将继续,则构造函数的声明类(如果尚未初始化)将被初始化。...* 如果基础方法是静态的,则声明该方法的类在尚未初始化的情况下被初始化。 * 如果方法正常完成,它返回的值将返回给invoke的调用方;如果该值具有基元类型,则首先将其适当地包装在对象中。

    6.7K40

    使用Python类的构造函数和析构函数

    1、问题背景当使用Python类时,可以使用构造函数和析构函数来初始化和清理类实例。构造函数在创建类实例时自动调用,而析构函数在删除类实例时自动调用。...构造函数__init__在Person类的实例被创建时被调用,它将类实例的name属性设置为传入的参数,并将类实例的人口计数population加1。...问题是,如果我在程序中显式地删除Person类的实例,析构函数__del__是否会被自动调用,或者我是否需要在“main”程序/类中添加一些东西,如上面的代码示例所示?...2、解决方案析构函数__del__会在垃圾回收器收集对象时自动调用,而不是在丢失对对象的最后一个引用时,也不是在执行del object时调用。...del__负责调用超类中的任何__del,尽管目前尚不清楚这是按照方法解析顺序(MRO)还是仅仅调用每个超类。

    20210

    简单的JavaScript继承

    _super()调用 Person超类的原始 init()和 dance()方法 本例的代码使我很愉快:它使得“类”的概念作为一种结构,保持继承简单,并且允许调用超类方法。...= function(prop) { var _super = this.prototype; // 实例化一个基础类(仅仅是创建实例,并没有运行初始化构造器) initializing...= arguments.callee; return Class; }; })(); 在我看来,最难的两个部分是“初始化/不调用init方法”和“创建_super方法”。...在合并过程中我们做了简单的检查:子类属性是否是一个函数、超类属性是否是一个函数、子类函数是否包含了 super引用。 注意,我们创建了一个匿名的闭包(返回了一个构造函数),将会封装并执行子类的函数。...最后我们调用原始的子类方法执行自己的工作(也有可能使用了 _super),然后将 _super恢复成原来的状态,并返回调用结果。

    59420

    Flutter 入门指北之 Dart

    可以在同一个对象上 连续调用多个函数以及访问成员变量 class Size{ double x; double y; @override String toString() {...Classes Dart 中的类都是单继承,但是同时支持 mixin 的继承机制(除 Object 类,每个类都只有一个超类),所有的类都继承于 Object,通过调用 runtimeType 判断实例的类型...默认构造函数没有参数,并且会调用超类的 没有参数的构造函数。子类不会继承超类的构造函数,子类如果没有定义构造函数,则只有一个默认构造函数。...json){ this.x = json['x']; this.y = json['y']; } // 因为构造函数不能继承,如果希望子类也有超类一样的命名构造函数,必须在子类中实现该构造函数...// 构造函数体执行之前除了可以调用超类构造函数之外,还可以初始化实例参数 // 初始化列表非常适合用来设置 final 变量的值 Size.fromJsonInit(Map json

    85650

    Java基础:继承

    ,二是调用超类的构造器。...使用 super 调用构造器的语句必须是子类构造器的第一条语句。 3. 继承初始化过程 在继承关系中,子类具有父类相同的行为,当子类调用父类方法时,如何确保父类的实例域是正确初始化的?...构造函数初始化: 从运行结果可以看出,根基类的 static 会首先执行,然后是下一个导出类,以此类推。...这种方式很重要,因为导出类的 static 初始化可能会依赖于基类成员能否被正确初始化。 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。...LoggingWidget 构造函数中会调用 Widget 的 实例构造器,正确的初始化父类的状态变量。

    57910
    领券