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

被调用的构造函数不是

您提到的“被调用的构造函数不是”可能指的是在编程中遇到的构造函数调用错误,这种情况通常发生在面向对象编程中。下面我将详细解释这个问题的基础概念、可能的原因以及解决方案。

基础概念

在面向对象编程语言中,构造函数是一种特殊类型的方法,用于初始化新创建的对象。构造函数的名称通常与类名相同,并且在创建类的新实例时自动调用。

可能的原因

  1. 构造函数名称错误:尝试调用的构造函数名称与类定义中的构造函数名称不匹配。
  2. 继承问题:在子类中调用父类的构造函数时,可能使用了错误的调用方式。
  3. 参数不匹配:传递给构造函数的参数类型或数量不正确。
  4. 访问修饰符限制:构造函数可能被声明为私有,导致在类外部无法调用。

解决方案

示例代码(Java)

假设我们有一个简单的类Person

代码语言:txt
复制
public class Person {
    private String name;

    // 构造函数
    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

如果我们尝试使用错误的构造函数调用方式,比如:

代码语言:txt
复制
Person person = new Person(); // 错误:没有无参构造函数

这将导致编译错误,因为Person类中没有定义无参构造函数。

正确的调用方式应该是:

代码语言:txt
复制
Person person = new Person("Alice"); // 正确

继承中的构造函数调用

如果Person类被继承:

代码语言:txt
复制
public class Student extends Person {
    private int studentId;

    public Student(String name, int studentId) {
        super(name); // 正确调用父类构造函数
        this.studentId = studentId;
    }
}

在这里,super(name);正确地调用了父类Person的构造函数。

应用场景

构造函数调用错误通常出现在以下场景:

  • 类库的使用:当使用第三方类库时,如果构造函数的调用方式不正确,会导致程序无法编译或运行。
  • 框架开发:在开发框架时,构造函数的正确调用对于对象的初始化至关重要。
  • 大型项目:在大型项目中,多个开发者可能同时修改同一个类,如果沟通不充分,可能会导致构造函数调用错误。

总结

确保构造函数的正确调用需要开发者仔细检查构造函数的名称、参数以及继承关系。在编译阶段捕获这类错误可以避免运行时的异常。如果遇到构造函数调用问题,应检查上述可能的原因并逐一排查。

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

相关·内容

【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )

MyClass { public: int x; // 默认构造函数 MyClass() { } }; 下面的代码 , 会自动调用 默认的 无参构造函数...; MyClass obj; // 调用 默认 构造函数 2、默认拷贝构造函数 " 默认拷贝构造函数 " 用于创建一个新对象作为现有对象的副本 , 其作用是将 现有对象 的成员变量 复制到 新对象中...; 创建一个类对象 并将其 赋值给 另一个类对象时 , 会自动调用 默认拷贝构造函数 ; 如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认的拷贝构造函数 " ,...& other) { x = other.x; } }; 下面的代码 , 第一行代码会自动调用默认的无参构造函数 , 第二行代码会自动调用默认的拷贝构造函数 ; MyClass...obj; // 调用默认无参构造函数 MyClass obj2 = obj; // 调用默认拷贝构造函数 二、构造函数调用规则 ---- 1、构造函数规则说明 构造函数调用规则 : 提供 默认无参构造函数

1.3K30
  • java构造函数调用另一个构造函数_java中的构造函数

    参考链接: Java程序从另一个调用一个构造函数 package demo03; /*  * 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法  * 格式:... * public 类名称(参数类型 参数名称){  *         方法体  *   * }  * 注意事项:  * 1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样  * 2.构造方法不要写返回值类型...,连void都不写  * 3.构造方法不能return一个具体的返回值  * 4.如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数,方法体什么都不做  * 5.一旦编写了至少一个构造方法...,那么编译器将不再赠送  * 6.构造方法也是可以进行重载的。  ...;     }     //有参数的构造方法     public Student(String name,int age) {         System.out.println("全参构造方法执行啦

    4.5K60

    Java构造函数调用顺序问题

    参考链接: Java构造函数 今天对Java的构造函数调用顺序进行研究,使用的是与C++类似的方法,即不对源码进行研究,而是直接通过打印代码对构造函数的调用顺序进行研究。 ...代码如下,使用的是Java核心技术中的代码,对其进行了改造,在构造函数中加入了输出信息  public class ConstructorTest {    public static void main...这里书中的讲解并不是很清楚,静态初始化块的优先级要高于域初始化块,因此静态初始化块的执行要早于域初始化块,只有在同级别的情况下,才按照声明的顺序调用,这一点我通过将static去掉进行了验证。 ...最后一点:如果构造器第一行调用了第二个构造器,则执行第二个构造器的主体。  最后还有一点非常重要的内容,构造器调用一定要是第一句,否则编译出错。...在构造器中只能调用一次其他构造函数,不能调用两次,即无法再调用第三个构造函数。  本人是初学者,还无法从JVM的角度分析问题,同时回应各位大神对文中的错漏进行指出。

    1.1K40

    禁止在构造函数里调用虚函数

    在构造函数中调用虚函数会导致程序出现莫名其妙的行为,这主要是对象还没有完全构造完成。...这是因为基类的构造函数调用一个定义在本类中的但是为派生类所重写的虚函数,程序运行的时候会调用派生类的版本,程序在运行期的类型是 A 而不是 B。...这么做主要是为了避免在构造函数中调用抽象类中的方法,防止抛出异常。虽然这么写可以避免这个问题但是还存在一个很大的缺陷,它会造成 str 这个对象在整个生命周期中无法保持恒定的值。...在构造函数还没有把该对象初始化完成之前,它的取值是由初始化语句决定的,但是执行完构造函数之后它的值却变成了构造函数中所设定的那个值。...Tip:C# 对象的运行期类型是一开始就定好的,即便基类是抽象类也依然可以调用其中的虚方法。 小结 在基类构造函数中调用虚函数会导致代码严重依赖于派生类的实现,然后这些实现是无法控制且容易出错的。

    1.6K20

    【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

    类的 实例对象时 , C++ 编译器 会自动调用 开发者定义的 构造函数 ; 2、构造函数显式调用与隐式调用 类 的 构造函数 可以 自动调用 , 也可以手动调用 ; 一般 默认的 无参构造函数 是 自动地...隐式调用 ; 有参构造函数 是 由开发者 手动显式调用 ; 3、构造函数替代方案 - 初始化函数 构造函数的替代方案 - 初始化函数 : 共有初始化函数 : 为每个类定义一个 public 共有初始化函数...; 调用时机 : 创建对象后需要马上进行初始化操作 ; 4、初始化函数缺陷 初始化函数 与 构造函数 对比 的缺陷 : 操作繁琐 : 初始化函数 只是一个普通的 共有函数 , 必须 由开发者 手动调用..., 造成未知风险 ; 无法调用 : 在某些特殊场合 , 初始化函数是无法被调用到的 , 如 : 只定义类的变量类型 , 没有调用构造函数 , 此时会自动调用无参构造函数初始化实例对象 , 如果使用初始化函数...; 默认拷贝构造函数 : 如果 类 中没有定义 拷贝构造函数 , C++ 编译器 会默认定义一个 默认拷贝构造函数 , 该函数的作用是进行简单的成员变量赋值 ; 6、代码示例 - 初始化函数无法及时调用

    85720

    【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

    次构造函数 ( 常用情况 ) VII . 次构造函数 ( 没有主构造函数 ) VIII . 构造函数 代码执行顺序 IX . 调用 主构造函数 / 次构造函数 创建类实例对象 I ....次构造函数委托主 : ① 委托方式 : 使用 : this ( 被委托的构造函数参数列表 ) 方式 , 直接或间接委托给主构造函数 ; ② 直接委托 : 每个次构造函数必须委托给主构造函数 ( 直接委托主构造函数...调用 主构造函数 / 次构造函数 创建类实例对象 ---- 1 ....② 主构造函数没有注解 */ class Student1 (name : String, age : Int){ } fun main() { //调用主构造函数 var student...: Student = Student("Tom" , 18) println(student) //调用次构造函数 var student2 = Student("Jerry

    4.1K10

    Java构造函数调用顺序问题

    大家好,又见面了,我是你们的朋友全栈君。 今天对Java的构造函数调用顺序进行研究,使用的是与C++类似的方法,即不对源码进行研究,而是直接通过打印代码对构造函数的调用顺序进行研究。...代码如下,使用的是Java核心技术中的代码,对其进行了改造,在构造函数中加入了输出信息 public class ConstructorTest { public static void main...这里书中的讲解并不是很清楚,静态初始化块的优先级要高于域初始化块,因此静态初始化块的执行要早于域初始化块,只有在同级别的情况下,才按照声明的顺序调用,这一点我通过将static去掉进行了验证。...最后一点:如果构造器第一行调用了第二个构造器,则执行第二个构造器的主体。 最后还有一点非常重要的内容,构造器调用一定要是第一句,否则编译出错。...在构造器中只能调用一次其他构造函数,不能调用两次,即无法再调用第三个构造函数。 本人是初学者,还无法从JVM的角度分析问题,同时回应各位大神对文中的错漏进行指出。

    72420

    JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用

    那么,this的值是什么呢? 函数的不同使用场合,this有不同的值。 总的来说,this就是函数运行时所在的环境对象。...下面分情况,详细讨论 纯粹的函数调用 函数的最通常用法,属全局性调用,this即代表全局对象。 ?...运行结果是1 作为对象方法的调用 函数还可以作为某个对象的方法调用,这时this就指这个上级对象 ? 结果:1 作为构造函数调用 通过这个函数,可以生成一个新对象。this就指这个新对象。 ?...运行结果为1 为了表明这时this不是全局对象,我们对代码做一些改变: ? 运行结果为2,表明全局变量x的值根本没变。 apply 调用 apply()是函数的一个方法,作用是改变函数的调用对象。...它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数。 ? apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。

    2.7K20

    构造函数调用子类的方法,写过吗?

    让我们看下最终的输出。 ? 从输出的结果看,Base的构造函数与虚构函数均调用Base的GetValue()返回1,而不是Derive的GetValue()。...从汇编代码进一步确认,C++编译器确实是直接调用Base的GetValue()地址,而不是通过虚函数指针__vfptr去获得GetValue()的地址。 ?...为什么Base的构造函数与虚构函数即使调用虚函数,也是调自己的函数呢?这跟构造函数与虚构函数的调用顺序有关。子类对象构造的时候,先调父类构造函数初始化父类,再调子类构造函数初始化子类。...因为父类的构造函数执行时,子类的构造函数还没有执行,说明子类还没有初始化,而这时就调用子类的方法,很容易出错,甚至崩溃。...父类的虚构函数执行的时候,子类的虚构函数已经执行完毕,说明子类的资源已经被释放,而这时继续执行子类的方法,也很容易崩溃。于是,C++规范为此作了此约束。

    1.4K20

    【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )

    一、构造函数分类 1、构造函数分类简介 C++ 构造函数可以分为以下几类 : 无参构造函数 : 最简单也是默认的构造函数 , 函数没有参数 , 如果创建一个对象 , 没有传入参数 , 调用的就是该类型的...< endl; } 下面的代码 , 是自动调用无参构造函数 , 创建 实例对象 的方法 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值 cout...; 拷贝构造函数 拷贝构造函数 : 拷贝构造函数 也是 有参构造函数 中的一种 , 传入的是 相同类型的 常量引用 , 该引用指向的内容在函数内不可修改 ; 在 " 拷贝构造函数 " 中 , 主要读取..." << endl; } 二、代码示例 - 三种类型构造函数定义与调用 ---- 在下面的代码中 , 分别在 Student 类中定义了 无参构造函数 有参构造函数 拷贝构造函数 分别调用了上述三种类型的...: " << s1.m_name << " , age : " << s1.m_age << endl; // 手动调用有参构造函数 // 直接调用构造函数会产生匿名对象, 涉及到该匿名对象的生命周期

    44710

    java构造代码块,构造函数和普通函数的区别和调用时间

    在这里我们谈论一下构造代码块,构造函数和普通函数的区别和调用时间。 构造代码块:最早运行,比构造函数运行的时间好要提前,和构造函数一样,只在对象初始化的时候运行。...构造函数:运行时间比构造代码块时间晚,也是在对象初始化的时候运行。没有返回值,构造函数名称和类名一致。...普通函数:不能自动调用,需要对象来调用,例如a.add(); 如果只看代码运行先后顺序的话:构造代码块>构造函数>普通函数 下面给一个程序 1 public class Test1 { 2 3...} 30 } 运行结果: image.png 通过上面的程序运行结果,我们可以看出,不管构造代码块是在构造函数之后还是在构造函数之前,都是先运行构造代码块 然后在运行构造函数。...构造函数通过重载,有两种初始化方式,一种是没有参数的,一种是有参数的。 如果不调用普通函数,普通函数是不能执行的。

    1.5K20

    6.3 被调用函数的声明和函数原型

    为了让大家有个明确的学习方向,请大家分享给有需要的人,谢谢!...一、被调用函数需要具备的条件 (1)首先被调用的函数必须是已经定义的函数(是库函数或者用户自己定义的函数) (2)如果使用库函数,应该在本文件开头用#include指令将调用有关库函数时所需用到的信...息“包含”到本文件中来 (3)如果使用用户自己定义的函数,而该函数的位置在调用它的函数的后面,应该在主调函 数中对被调函数作声明 二、函数声明 一般形式 (1)函数类型 函数名(参数类型...1 参数名1,参数类型2 参数名2,...参数类型n 参数名n) (2)函数类型 函数名(参数类型1,参数类型2,...参数类型n) 注意:如果已在文件的开头(在所有函数之前),已经对本文件中所调用的函数进行了声...明,则在个函数中不必对其所调用的函数再作声明 原创不易,未经本公众号允许禁止转载,否则追究法律责任

    1.3K3229

    【C++】构造函数与析构函数概念简介 ( 构造函数和析构函数引入 | 构造函数定义与调用 | 析构函数定义与调用 | 代码示例 )

    " 构造函数 " 是 C++ 类中的一种特殊的 " 成员函数 " , 该函数不需要用户手动调用 , 而是在 C++ 类 实例对象 创建时 , 自动执行的 ; " 析构函数 " 是 构造函数 的 对应相反的函数...名称 与 类名相同 ; 构造函数参数 : 构造函数 可以有 若干参数 , 也可以没有参数 ; 构造函数返回值 : 构造函数 没有返回值 ; 2、构造函数调用 构造函数调用 : 自动调用 : C++ 编译器会...在创建 C++ 类实例对象时 , 自动调用类的 构造函数 ; 手动调用 : 构造函数 也可以手动调用 , 如调用构造函数的重载函数 ; 3、代码示例 - 构造函数定义与调用 定义了一个 C++ 类 Student...析构函数 析构函数 在栈内存中定义了 Student s1, s2; 对象变量 , 栈内存的特点是 后进先出 , 创建时 , 第一个构造函数调用的是 s1 的构造函数 , 第二个构造函数调用的是 s2...的构造函数 , 销毁变量时 , 先销毁 s2 对象 , 调用 s2 对象的 析构函数 , 然后销毁 s1 , 调用 s1 对象的 析构函数 ;

    35420

    小朋友学C++(10):子类构造函数调用父类构造函数

    从哲学层面来看,子类会继承父类除private以外的所有成员。 因为构造函数是公有的,所以理所当然地会被子类继承。...分析: 这里构造函数的写法是 Rectangle() : Shape() { 子类构造函数本身的语句; } 这是先调用父类的构造函数,再执行它本身的语句。从运行结果也可以看出这一点。...那么,如果不显示调用父类的构造函数Shape()呢?父类的构造函数就不被调用了吗? 咱们可以用下面的程序来验证。...分析: 从运行结果可以看出,程序1和程序2的运行结果完全一致。也就是说,Shape()即使不显示调用,实际上也会被调用。并且调用顺序优先于子类本身的构造函数。

    1.5K60

    JAVA & .NET创建对象构造函数调用顺序

    constructor chinese init block chinese init block2 chinese constructor 执行顺序为: 基类静态初始化块——当前类静态初始化块——基类初始化块——基类构造函数...——当前类初始化块——当前类构造函数 ⚠️ JAVA中加载类时会调用类的静态代码块 try { Class.forName("models.Chinese"); } catch (ClassNotFoundException...chinese static constructor person static constructor person constructor chinese constructor 执行顺序为: 当前类静态构造函数...——基类静态构造函数——基类构造函数——当前类构造函数 小结 JAVA与.NET创建对象时都是先执行静态代码块后执行非静态代码块; JAVA先执行基类中的静态及非静态代码块; .NET先执行基类中的静态代码块...,先执行当前类中的实例构造函数;

    1.1K20

    怎么用super调用超类构造函数?

    使用super调用超类构造函数 子类可以调用超类中定义的构造函数方法,用super的下面形式:java复制代码super(parameter-list); 这里,parameter-list定义了超类中构造函数所用到的所有参数...这使Box( )构造函数被调用,用w、h和d来初始化width, height, 和 depth。BoxWeight不再自己初始化这些值。它只需初始化它自己的特殊值:weight。...既然构造函数可以被重载,可以用超类定义的任何形式调用super( ),执行的构造函数将是与所传参数相匹配的那一个。...例如,下面是BoxWeight一个完整的实现,BoxWeight具有以不同方法构造盒子的构造函数。在每种情况下,用适当的参数调用super( )。...BoxWeight类型而不是Box类型的对象调用。

    14310

    比较显式调用构造函数和析构函数

    ,其实做了两件事, 一是:调用malloc分配所需内存(实际上是调用operator new),二是:调用构造函数。...delete的时候,也是做了两件事, 一是:调用析造函数,二是:调用free释放内存(实际上是调用operator delete)。...这里只是为了演示,正常情况下析构函数只会被调用一次,如果被调用两次,而析构函数内有delete的操作,会导致内存释放两次的错误。 2....    return 0; } 输出为: Constructors n=1 3.显示调用构造函数(第二种方式):placement new  #include  using...,不能用delete      return 0; } Constructors n=1 Destructors placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象

    1.4K100

    【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )

    文章目录 一、BaseDexClassLoader 构造函数 二、DexPathList 构造函数 三、DexPathList.makeInMemoryDexElements 函数 一、BaseDexClassLoader...源码 ) 分析到 , 在 InMemoryDexClassLoader 类加载器中 , 调用了父类 BaseDexClassLoader 的 2 个参数的构造函数 ; BaseDexClassLoader...构造函数如下 , 在该构造函数中创建了 DexPathList 对象 , 并赋值给了 pathList 成员 ; BaseDexClassLoader 构造函数源码 : /** * 用于各种基于dex...---- 在 DexPathList 构造函数中 , 调用了 makeInMemoryDexElements 方法创建 DEX 相关的 Element 元素 ; /** * 一对条目列表,与{@code...---- 在 makeInMemoryDexElements 方法中 , 根据内存中的字节数组数据 , 获取 DexFile , 将内存数据传入了 DexFile 的构造函数 ; 注意 : 传入 DexFile

    1.3K40
    领券