当前位置: 首页 > 知识库问答 >
问题:

构造函数调用是否创建新实例?

郑宇
2023-03-14

我学到了两件事:

  1. new-操作符创建一个新实例,然后执行声明的connstuctor来初始化该新实例

根据我的理解,这些说法互相反对。

例如,new example()不会创建两个实例,因为new-操作符创建一个实例,构造函数调用this()并创建另一个实例?当然不会,但现在到底是什么创建了一个实例。。。?

class Example
{
    private boolean _b;

    public Example()
    {
        this(false);
    }

    public Beispiel(boolean b)
    {
        _b = b;
    } 
}

共有3个答案

龙繁
2023-03-14

通过调用this(false),您不会创建一个新实例。您只需要在构造函数中调用一个构造函数(与您传递的参数数量相匹配的构造函数),我现在想不出任何有效的实际用途,但仍然是完全有效的。请注意,要像这样链接构造函数,您必须在“父”构造函数的第一行中进行新的构造函数调用。如果这有意义的话。底线:您创建一个对象。也许为每个不同的构造函数调用添加print语句可以帮助您更好地理解这一点。

另外,看看这里:在Java中如何从一个构造函数调用另一个构造函数?

陆甫
2023-03-14

您可以在构造函数中使用this调用具有不同参数数的同一类的构造函数,例如:

class Example{
    private boolean b;
    public Example(){
        this(false) // you now call public Example(boolean b) to save code istead of    this.b=false
    }
    public Example(boolean b){
        this.b = b;
    }
}
方光华
2023-03-14

第二点不正确:调用this()不会“创建新实例”。相反,它调用的构造函数(通常与new调用的构造函数不同)。

调用new创建新实例。

 类似资料:
  • 问题内容: 当我们创建扩展抽象类的Subclass对象时,抽象类构造函数也会运行。但是我们知道我们不能创建抽象类的对象。因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗? 问题答案: 因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗? 简而言之,a 不会创建对象。它只是 初始化 对象的 状态 。创建对象的是操作员。现在,让我们详细了解一下

  • 问题内容: 在Java中,数组是AN对象。我的问题是…创建新数组时是否调用了Object构造函数?我们希望利用这一事实来为Object构造函数提供一些额外的字节码,以检查所构造数组的长度。那行得通吗? 问题答案: 就Java语言规范而言,尽管它们都使用关键字,但类实例创建表达式和数组创建表达式是不同的表达式形式,每种都有自己的规则。数组创建表达式的描述未提及调用构造函数。

  • 问题内容: 我正在尝试修复我的一个程序中的错误,我认为这可能是由于Hibernate弄清楚了如何在不调用其默认(或任何其他)构造函数的情况下实例化对象的实例。 问题答案: 实际上,是的,如果使用objenesis为您实例化对象,则可以在实例化对象时绕过构造函数。它执行字节码操作来实现此目的。 反序列化对象也将绕过构造函数。 使用反射无法做到这一点。

  • 问题内容: 有没有一种方法可以给定类名称(动态)来创建特定类的实例,并将参数传递给其构造函数。 就像是: 的构造函数的参数在哪里? 问题答案: 是的,类似: 当然,这仅适用于单个字符串参数,但是你可以轻松地对其进行修改。 注意,类名必须是完全合格的,即包括名称空间。对于嵌套类,你需要使用美元(因为这是编译器使用的美元)。例如: 要获得该Class对象,你需要。

  • 我正在从一个教程中重构下面的代码。当我< s >运行编译它时,我得到以下错误: Vierbeiner类中的构造函数Vierbeiner不能应用于给定类型;必需:java.lang.找到字符串:无参数原因:实际参数列表和正式参数列表长度不同 我的理解是,发生这个错误是因为父类Vierbeiner有一个需要字符串参数的构造函数,而没有一个不需要参数的构造函数。我不明白的是,为什么我在没有创建Hund类

  • @adilooze解决方案