构造函数是静态的还是非静态的?

13

根据标准书籍,构造函数是一种特殊类型的函数,用于初始化对象。由于构造函数被定义为函数,并且在类内部函数只有两种类型,即静态或非静态。我的疑问是什么是构造函数?

1.)As constructor is called without object so it must be static

  Test test =new  Test();//Test() is being called without object
   so must be static

我的疑问是,如果构造函数是静态方法,那么我们如何在构造函数内部频繁使用“this”关键字?

Test(){
    System.out.println(this);
}

输出 Test@12aw212 是不是意味着构造函数非静态?


不是很确定你的问题,但在Java中构造函数不是静态的(虽然有一个静态块)。构造函数设置对象的初始使用,并在实例化时调用。 - Ben
2
一个构造函数何时会是静态的? - Roman C
“标准书”是什么?所有JLS都说的是,“除了名称之外,在所有其他方面 [other than its name],构造函数声明看起来就像没有结果类型的方法声明”(我的重点)。如果你的书与此有任何不同,那它就是定义上错误的。没有任何内容表明“构造函数是一种特殊类型的函数”,因此“静态/非静态”的问题甚至不会出现。这不是一个真正的问题。 - user207421
11个回答

14

你的第二个例子很贴切。 this 引用在构造函数中是可用的,这意味着构造函数会针对某个对象执行 - 当前正在创建的对象。

原则上,当您使用 new 运算符创建一个新对象时,JVM 将为其分配一些内存,然后在该新创建的对象上调用构造函数。同时 JVM 确保在构造函数之前不会调用任何其他方法(这就是它的特殊之处)。

实际上,在机器级别上,构造函数是具有一个特殊隐含参数 this 的函数。 这个特殊的参数(由运行时传递)区分了对象和静态方法。 换句话说:

foo.bar(42);

被翻译为:

bar(foo, 42);

第一个参数名为this。另一方面,static方法按原样调用:

Foo.bar(42);

翻译为:

bar(42);

Foo 在这里只是一个存在于源代码中的命名空间。


我明白你的意思,但是你能否详细说明一下它的含义?我们可以说构造函数在本质上是非静态的吗?或者说它是一个得到特殊处理的特殊情况。 - Arun
1
@Arun:构造函数是普通方法,除了以下几点:(1)它们不是虚拟的(这没有太多意义)(2)JVM会在new操作符上自动调用它们(3)你不能在构造函数之前调用任何方法。 - Tomasz Nurkiewicz

0

构造函数是非静态的。每个方法的第一个参数都是隐式的 this(除了静态方法),而构造函数就是其中之一。


0
构造函数不是静态函数。当你执行Test test = new Test();时,会创建一个新的Test对象,然后在该对象上调用构造函数(我的意思是this指向新创建的对象)。

0

这里的关键是new关键字。你注意到了一般情况下,如果没有对象调用方法,该方法就是静态的。但在这种特殊情况下(即在new关键字之前),编译器知道要调用构造函数。


0

new 运算符返回对其创建的对象的引用。

new Test(); // creates an instance.

System.out.println(this); 是在 new 操作符实例化对象之后被调用的。


-1

静态:

Temp t= new Temp();

new运算符在堆区创建内存,并将其作为Temp(this)隐式地传递给构造函数。然后,它将一个在名为this的类中定义的非静态实例变量初始化为局部参数变量this

下面的示例仅用于理解概念,如果有人试图编译它,将会导致编译时错误。

class Temp{
    int a;
    Temp this; //inserted by compiler.
    Temp(Temp this){ //passed by compiler
        this.this=this; // initialise this instance variable here. 
        this.a=10;//when we write only a=10; and all the non-static member access by this implicitly.
        return this; // so that we can't return any value from constructor.
    }
}

构造函数是静态的,因为:

  1. 它有助于创建对象。
  2. 它可以在没有对象的情况下被调用。

this 不是“定义在类中的非静态实例变量”,而且构造函数体内存在 this 表明你不可能将其描述为静态的。 - user207421
说构造函数是静态的是一个相当强烈的断言,因为它可以 - 并经常会 - 初始化实例变量,除了必要时处理自我引用“this”。此外,正如在这里回答的那样,“new”运算符会在调用构造函数之前创建一个实例。 - Humberto Fioravante Ferro

-1

当我们谈论静态类时,我们会想到方法是通过类名调用的,但在构造函数的情况下,构造函数在对象创建时初始化,因此这被证明是非静态的。


-1

-1

都不是。

方法可以分为两种类型:静态/非静态方法,也称为类/实例方法。

但构造函数不是方法。


-1

构造函数既不是静态的(使用类名调用),也不是非静态的,而是在创建对象时执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接