您的位置 首页 java

为什么不允许使用 Java 静态构造函数?

欢迎关注头条号: Java 小野猫

不允许使用 Java 静态 构造函数 ,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么。

Java 静态构造函数

假设我们有一个定义为的类:

public class Data {
 private int id;
 
 public static Data() {}
}
 

如果您尝试编译此类,则会 在 Data 类型的构造函数中 收到一条错误消息,作为 非法修饰符。仅允许公开,受保护和私有

静态属于类,构造函数属于对象

我们知道 静态方法 ,静态块或变量属于该类。而构造函数属于该对象,并在使用 new 运算符创建实例时调用。由于构造函数不是类属性,因此有理由认为它不能是静态的。

静态块 / 方法无法访问非 静态变量

我们知道静态方法不能访问非静态变量。静态块也是如此。

现在,构造函数的主要目的是初始化对象变量。因此,如果我们将构造函数设置为静态,则无法初始化对象变量。这将破坏使用创建对象的构造函数的全部目的。因此,使构造函数为非静态是合理的。

注意,我们不能this在静态方法中使用引用对象变量。下面的代码将定义编译错误,因为: 不能在静态上方中使用它

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();
 }
}
 

上面的程序将产生以下输出。

Data Constructor
DataChild Constructor
 

如果,您看一下super()方法,它不是静态的。因此,如果构造函数转换静态,我们将无法使用它,这将破坏java中的继承性。

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架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码, MyBatis Netty ,Redis,Kafka,Mysql, Zookeeper ,Tomcat,Docker, Dubbo ,Nginx等多个知识点的架构资料)

其中覆盖了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,很值得大家借鉴和学习,扩展自己的技术广度和知识面。

文章来源:智云一二三科技

文章标题:为什么不允许使用 Java 静态构造函数?

文章地址:https://www.zhihuclub.com/183084.shtml

关于作者: 智云科技

热门文章

网站地图