为什么其他方法可以是“静态”,但构造函数不能?
我不明白为什么主要的方法必须是静态的。 我理解静态variables,但静态方法很难掌握。 是否存在静态方法,以便可以在两个不同的类中创build具有相同名称的两个方法,而不会相互冲突?
另外,我不明白为什么我不能创build一个静态构造函数。
谁能帮助解释这个概念?
Java有 [静态构造函数] 静态初始化块可以被看作是一个“静态构造函数”:
class Foo { static String Bar; static { // "static constructor" Bar = "Hello world!"; } }
在任何情况下,主要类中唯一必须是静态的方法是main
方法。 这是因为在不首先创build“主类”的实例的情况下调用它。 一种常见的技术,我更喜欢的是迅速摆脱静态环境:
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(); } }
此外,静态与“名称冲突”无关。 静态方法(或variables)只是一个方法(或variables), 不与某个types的特定实例相关联。 我build议阅读通过类和对象Java教程和部分了解实例和类variables 。
快乐的编码。
我分享的原因之一“为什么不是一个Java构造函数是静态的”。
简单地说,“一个Java构造函数总是非静态的”,因为,
构造函数的目的只是初始化/构造对象,并使inheritance成为可能。 要做到这一点,我们需要使用两个有用的java关键字(暨非静态variables),如this和super。 我们将使用“this”来初始化对象。 我们/ Java将使用super(ofcourse super())来调用超类的构造函数,以便首先创build超级对象(或对象类),然后创build子对象(因此是inheritance)。如果构造函数是静态的,那么我们不能使用这两个关键字非静态variables)在构造函数内(因为我们知道非静态的东西不能被静态上下文引用)
所以Java构造函数不应该是静态的。
静态方法属于一个类,而不是一个对象。 主方法必须是静态的,因为在任何其他代码执行实例化任何对象之前,它首先被调用。 它为程序提供了一个切入点。 静态方法从对象的容器外部调用。 静态类variables也是如此。 只有一个副本存在整个类,而不是一个成员variables,这是从一个类创build的每个对象创build一次。 它们被用来存储类的数据,比如已经创build了对象实例的数量,而不是被销毁。 这个数据属于这个类。 静态方法的一个很好的例子是单例模式,其中构造函数是私有的,只能由静态成员函数访问。 类之外的函数将无法复制此function。 该方法作用于类数据和对象,因此逻辑上属于同一类。 这一切都归结为封装。 一个class级只负责自己,只知道自己。
另一方面,对象方法意味着对与类的一个实例(一个对象)相关的数据进行操作。 构造函数是用于初始化对象并将其数据设置为初始状态的代码。 内存分配完成后,会立即(自动)执行它们以存储新的对象。 即使你没有明确地定义一个构造函数,为了将对象的成员variables和对象的方法代码映射到新的对象上,也会执行一种“默认构造函数”。
希望这可以帮助。
构造函数用于创build对象。
静态通常对于所有对象都是相同的。
所以,如果我们有静态构造函数创build一个对象会影响所有其他现有的对象。
静态方法只引用静态variables。 因此,您为创build对象而创build的所有初始参数都将针对所有对象进行更改。 创build类似的对象是没有用的。
希望这可以帮助…. :)
我昨天写了一个简单的例子作为对相关问题的回答,这可能会使事情变得更容易理解: java构造函数的意义何在?
静态方法的要点是,可以在不创build类的实例的情况下调用它们,而“常规”实例方法与实例相关,不能在没有实例的情况下调用。
由于Main类的Main方法是程序的入口点,所以还没有可能创build的实例,所以自然不能通过实例来访问它。 因此,它是静态的,所以它可以作为程序的开始运行。
只要看看这个链接,它肯定会帮助你理解: 为什么不能构造一个静态的?
和
当我们创build对象时,构造函数在运行时被调用。 所有对象的静态都是相同的,但所有对象都有自己的状态和属性。 所以,如果我们有静态构造函数创build一个对象会影响所有其他现有的对象。 注意:静态是类级别,而构造函数与对象相关。
例如
public class Foo { String name; int id; // define constructors Foo (String name, int id) { this.name = name; this.id = id; } psvm(String[] arg) { Foo f1 = new Foo("Amit",001); Foo f2 = new Foo("Rahul",002); } }
如果我们创build静态构造函数,那么两个对象(f1也)将包含关于名称和id的最后更新的值作为Rahul和002。
构造函数不能是静态的,因为在OO语言中,创build对象的过程如下所示:
- 分配对象
- 调用构造函数来初始化新分配的对象
构造函数不在其他地方使用(types安全的语言应该强制执行此操作),所以它总是在非静态上下文中调用构造函数。
如果构造函数是静态的,它将不会接收到新分配的对象的引用,因此将无法初始化它。
因此,构造函数总是非静态的(因为它总是从非静态的上下文中调用的),并且必须始终是非静态的(否则将无法执行其任务)。
main(String[])
方法有一个特定的原型,它由Java运行时环境的工作方式决定。 从命令行调用java MyApplication
,Java VM将查找包含在该类中的静态main(String[])
方法以执行该应用程序。 如果找不到该方法,则Java VM将无法将该类作为应用程序运行。 这就是语言的定义。 这也意味着Java虚拟机不会创build应用程序类的实例来运行它。
现在,如果你希望你的类可以作为一个独立的应用程序使用,或者作为一个由别的东西创build的实例,那么你可以让你的类实现Runnable
接口,并且提供一个main
方法来执行一个新的run
方法实例。
public class MyRunnableThing implements Runnable { // Define whatever variables your runnable thing needs here as // private instance fields. /** Fulfills requirements of Runnable interface. */ public void run() { System.out.println( "I'm running..." ) ; } /** Also makes the class runnable from the console. */ public static void main( String[] args ) { MyRunnableThing runMeNow = new MyRunnableThing() ; runMeNow.run() ; } }
现在, 任何类都可能创build一个MyRunnableThing
的实例,并使用它的run()
方法产生与执行java MyRunnablething
相同的行为 。
另请参阅: 在Java中使用静态构造函数 。 这个问答的一些亮点:
- 构造函数用于创build类的实例,所以它是一个实例方法,而不是静态方法。
- 您可以创build一个静态方法,使用构造函数创build该类的一个实例。 这就是时髦的新“build设者”class的工作方式。
- 您可以创build一个静态方法,返回一个持久的,唯一的单例实例。
- 如果你的类有静态成员,那么你可以创build一个静态初始化器来初始化这些成员的值。
构造函数的目的是构造一个对象,即初始化类的实例variables的默认值或初始值。 非静态实例variables不能被静态方法访问。 所以构造函数不是静态的。
声明为静态的方法不需要创build对象。因为我们不为main方法创build对象,所以声明为static。
构造函数被隐式地调用来初始化一个对象,所以没有静态构造函数的目的。
构造函数是一个对象的属性,而静态与对象无关。 这就是为什么没有像静态构造函数 。 但是我们有静态块来做和构造函数类似的任务,比如字段的初始化等等。