为何不容许使用 Java 静态构造函数?

不容许使用 Java 静态构造函数,可是为何呢?在深刻探讨不容许使用静态构造函数的缘由以前,让咱们看看若是要使 构造函数静态化 会发生什么。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中的继承性。

 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」...

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

相关文章
相关标签/搜索