不允许使用 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知识哦,期待你的到来!

  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「面试」,领取BATJ面试资料、面试视频攻略。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
  • 千万不要发送「1024」...



每日福利

最新文章

  1. PHP正则表达式
  2. web前端学习(二) javascript对象和原型继承
  3. centos 6.5重置Root密码
  4. 移动web开发之视口viewport
  5. Snort - manual 笔记(三)
  6. JSP Filter
  7. jsp之 ---- 页面重定向和请求转发(笔记之深度说明)
  8. vue.js中ajax请求
  9. Customer segmentation – LifeCycle Grids, CLV and CAC with R(转)
  10. 如何才能通俗易懂的解释javascript里面的"闭包"?
  11. 设备指纹识别之User Agent 解析
  12. 【redis】redis5.0的一些新特性
  13. LNMP php缓存器下载
  14. Spring重温(二)--Spring JavaConfig
  15. mvc5怎么给所有action都设置几个公用的ViewBag
  16. open-falcon ---安装Dashboard时候报错"SSLError: The read operation timed out"
  17. js my_first
  18. POJ 1751 Highways 【最小生成树 Kruskal】
  19. 浅析Hyperledger Fabric共识算法 摘自http://www.cocoachina.com/blockchain/20180829/24728.html
  20. Single Pattern(单例模式)

热门文章

  1. [ERR] Node 172.16.6.154:7002 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
  2. mssql sqlserver sql对使用逗号分隔的字符串 转换为数据表的另类方法实现
  3. chunked
  4. Python语法速查: 16. 时间日期处理
  5. MATLAB聚类有效性评价指标(外部 成对度量)
  6. MATLAB实例:绘制条形图
  7. csp2019后的感慨
  8. 案例:Oracle 10g RAC 集群无法启动
  9. windows下cocos2d-x环境搭建
  10. IL指令列表