构造函数是否始终必须是公共的?

我的第一个问题是——

   class Explain() {
        public Explain() {
      }
   }

构造函数是否应始终声明为公共?

如果我创建一个构造函数呢?private

我总是看到构造函数是隐式的。那么为什么构造函数是有用的呢?还是根本没有用。因为没有人可以调用它,或者永远不会创建一个对象(因为构造函数)!这是我的第二个问题。publicprivateprivate


答案 1

不可以,构造函数可以是 、 或 (根本没有访问修饰符)。publicprivateprotecteddefault

制作某些东西并不意味着没有人可以访问它。这只是意味着类外的任何人都无法访问它。所以构造函数也很有用。privateprivate

构造函数的用途之一是为单例类提供服务。单例类是将创建的对象数限制为一个的单一类。使用构造函数,我们可以确保一次不能创建多个对象。privateprivate

示例 -

public class Database {

    private static Database singleObject;
    private int record;
    private String name;

    private Database(String n) {
        name = n;
        record = 0;
    }

    public static synchronized Database getInstance(String n) {
        if (singleObject == null) {
            singleObject = new Database(n);
        }

        return singleObject;
    }

    public void doSomething() {
        System.out.println("Hello StackOverflow.");
    }

    public String getName() {
        return name;
    }
}

有关访问修饰符的详细信息。


答案 2

是的,构造函数可以具有任何访问说明符/访问修饰符。

私有构造函数对于创建类非常有用。singleton

单例 - 单例类是在运行时只能创建单个对象的类(每个 JVM)。

单例类的一个简单示例是 -

class Ex {
    private static Ex instance;
    int a;
    private Ex() {
        a = 10;
    }
    public static Ex getInstance() {
        if(instance == null) {
            instance = new Ex();
        }
        return instance;
    }
}

请注意,对于上述类,获取对象(在此类外部)的唯一方法是调用 getInstance() 函数,该函数将仅创建单个实例并继续返回该实例。

另请注意,这不是线程安全的。