为什么其他方法可以"静态"但构造函数不能?

use*_*246 44 java static constructor

我不明白为什么main方法必须是静态的.我理解静态变量,但我很难掌握静态方法.是否存在静态方法,以便可以在两个不同的类中创建两个具有相同名称的方法,这些方法不会相互冲突?

另外,我不明白为什么我不能创建静态构造函数.

谁能帮助解释这个概念?

小智 84

Java有 [静态构造函数] 静态初始化块,可以看作是"静态构造函数":

class Foo {
  static String Bar;
  static {
     // "static constructor"
     Bar = "Hello world!";
  }
}
Run Code Online (Sandbox Code Playgroud)

在任何情况下,主类中唯一必须是静态的main方法是方法.这是因为在没有首先创建"主类"的实例的情况下调用它.一种常见的技术,也是我喜欢的技术,是快速摆脱静态环境:

class Main {
   int argCount;

   // constructor
   public Main (String[] args) {
     // and back to boring ol' non-static Java
     argCount = args.length;       
   }

   void runIt () {
      System.out.println("arg count: " + argCount);
   }

   // must be static -- no Main instance created yet
   public static void main (String[] args) {
      Main me = new Main(args);
      me.runIt();
   }
}
Run Code Online (Sandbox Code Playgroud)

而且,静态与"名字冲突"无关.静态方法(或可变的)仅仅是一个的方法(或可变的)与一种类型的特定实例相关联.我建议阅读Classes and Objects Java Tutorial以及Understanding Instance和Class Variables一节.

快乐的编码.

  • 这不称为构造函数.这实际上称为在类加载时执行的静态初始化块.要说构造函数作为类的构造函数是错误的,创建该类的对象. (14认同)

sre*_*ram 25

我分享的原因之一是"为什么java构造函数不是静态的".

简单地说,"java构造函数总是非静态的"因为,

构造函数的目的只是初始化/构造对象,并使继承成为可能.要做到这些,我们需要使用两个有用的java关键字(兼非静态变量),例如this和super.我们将使用'this'来初始化对象.我们/ Java将使用super(ofcourse super())来调用超类构造函数,以便首先创建超级对象(或Object类),然后创建子对象(因此继承)如果构造函数是静态的,那么我们不能使用这两个关键字(构造函数内部的非静态变量(我们知道非静态的东西不能从静态上下文中引用)

所以java构造函数不应该是静态的.


Sin*_*a V 7

静态方法属于类,而不是对象.main方法必须是静态的,因为在执行任何其他代码实例化任何对象之前,首先调用它.它提供了该程序的入口点.从对象的容器外部调用静态方法.静态类变量也是如此.整个类只存在一个副本,而不是成员变量,该变量为从类创建的每个对象创建一次.它们用于存储类的数据,例如已创建但未销毁的对象实例数.此数据属于该类.静态方法的一个很好的例子是单例模式,其中构造函数是私有的,只能由静态成员函数访问.类外的函数将无法复制此功能.此方法作用于类数据和对象,因此逻辑上属于同一个类.这一切都归结为封装.一个类只对自己负责,只知道自己.

另一方面,对象方法意味着对与类的一个实例(对象)相关联的数据进行操作.构造函数是用于初始化对象并将其数据设置为初始状态的代码.在分配内存以存储新对象后立即(并自动)执行它们.即使您没有明确定义构造函数,也会执行一种"默认构造函数",以便将对象的成员变量和对象的方法代码映射到新对象.

希望这可以帮助.


use*_*445 7

构造函数用于创建对象.

静态通常对于所有对象都是相同的.

因此,如果我们有静态构造函数,则创建一个对象会影响所有其他现有对象.

静态方法仅引用静态变量.因此,您为创建对象提供的所有初始参数都将针对所有对象进行更改.没有必要创建类似的对象.

希望这可以帮助.... :)