zoukankan      html  css  js  c++  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知识哦,期待你的到来!

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

    在这里插入图片描述
    每日福利

  • 相关阅读:
    SQL Server 存储过程
    Ajax从服务器端获取数据
    Ajax中Get请求与Post请求的区别
    get请求
    Post请求
    递归案例
    SQL SERVER 和ACCESS的数据导入导出
    OA
    OBS桌面视频直播软件/推流工具使用指南
    基于EasyIPCamera实现的数字网络摄像机IPCamera的模拟器IPC RTSP Simulator
  • 原文地址:https://www.cnblogs.com/java-friend/p/11750671.html
Copyright © 2011-2022 走看看