不容许使用 Java 静态构造函数,可是为何呢?在深刻探讨不容许使用静态构造函数的缘由以前,让咱们看看若是要使 构造函数静态化 会发生什么。java
假设咱们有一个定义为的类:程序员
public class Data { private int id; public static Data() {} }
若是您尝试编译此类,则会在 Data 类型的构造函数中收到一条错误消息,做为非法修饰符。仅容许公开,受保护和私有。面试
咱们知道静态方法,静态块或变量属于该类。而构造函数属于该对象,并在使用 new 运算符建立实例时调用。因为构造函数不是类属性,所以有理由认为它不能是静态的。算法
咱们知道静态方法不能访问非静态变量。静态块也是如此。函数
如今,构造函数的主要目的是初始化对象变量。所以,若是咱们将构造函数设置为静态,则没法初始化对象变量。这将破坏使用建立对象的构造函数的所有目的。所以,使构造函数为非静态是合理的。this
注意,咱们不能this
在静态方法中使用引用对象变量。下面的代码将定义编译错误,由于:不能在静态上方中使用它。code
public static void main(String args []){ System.out.println(this.id); }
在Java中,每一个类都隐式扩展了对象类。咱们能够定义一个类层次结构,其中子类构造函数调用超类构造函数。这是经过super()
方法调用完成的。大多数状况下,JVM自动调用超类构造函数,但有时若是超类中有多个构造函数,咱们必须手动调用它们。视频
让咱们来看一个super()
用法示例。对象
package com.journaldev.util; class Data { Data() { System.out.println("Data Constructor"); } } public class DataChild extends Data{ public DataChild() { super(); //JRE calls it explicitly, calling here for explanation System.out.println("DataChild Constructor"); } public static void main(String args[]) { DataChild dc = new DataChild(); } }
上面的程序将产生如下输出。blog
Data Constructor DataChild Constructor
若是,您看一下super()
方法,它不是静态的。所以,若是构造函数转换静态,咱们将没法使用它,这将破坏java中的继承性。
若是要在类中初始化一些静态变量,则可使用静态块。请注意,咱们没法将参数传递给静态块,所以,若是您要初始化静态变量,则也能够在常规构造函数中执行此操做。
class Data { public static int count; static { count = 0; } Data(int c) { //not recommended since the count is class variable //and shared among all the objects of the class count=c; } }
咱们说明了为何不容许使用Java静态构造函数。咱们可使用静态块以及构造函数自己来初始化静态变量。
“不积跬步,无以致千里”,但愿将来的你能:有梦为马 随处可栖!加油,少年!
关注公众号:「Java 知己」,天天更新Java知识哦,期待你的到来!
每日福利