java private 构造函数_java-构造函数是否必须总是公开的?

2023-11-13

java-构造函数是否必须总是公开的?

这个问题已经在这里有了答案:

java中private构造函数的用法是什么?                                     10个答案

我的第一个问题是-

class Explain() {

public Explain() {

}

}

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

如果我创建27386807646981990199040构造函数,该怎么办。

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

11个解决方案

75 votes

否,构造函数可以是private、private、protected或default(完全没有访问修饰符)。

制作private并不意味着没有人可以访问它。 这只是意味着该类之外的任何人都不能访问它。 因此private构造函数也很有用。

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

范例-

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;

}

}

有关访问修饰符的更多信息。

Dhanuka answered 2020-02-08T15:30:48Z

10 votes

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

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

Singleton-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()函数,该函数只会创建一个实例并继续返回该实例。

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

Anand S Kumar answered 2020-02-08T15:31:31Z

7 votes

构造函数可以是公共的,默认的或私有的,而这一切都取决于您要对其进行处理。

例如,如果要定义Singleton类,则最好隐藏(意味着将其设为私有,以便仅对其所属的类可用)构造函数,以防止其他类随意实例化您的类。

出于测试目的,您可能希望将其声明为默认值,以便同一包中的测试用例可以访问它。

更详细的信息可以在这里找到

Alp answered 2020-02-08T15:32:06Z

5 votes

没有构造函数要公开的规则。通常,我们将其定义为公开只是因为我们也想从其他类中实例化它。

私有构造函数的意思是“除我之外,我不允许任何人创建实例”。因此,通常,当您要使用单例模式时,可以执行此操作。

以下是JDK中使用私有构造函数的类。

public class Runtime {

private static Runtime currentRuntime = new Runtime();

public static Runtime getRuntime() {

return currentRuntime;

}

// Don't let anyone else instantiate this class

private Runtime() {

}

}

Aston Ray answered 2020-02-08T15:32:35Z

5 votes

不,构造函数可以使用任何访问修饰符,包括private。 (私人构造函数意味着只有类本身中的代码才能实例化一个对象这种类型,所以如果私有构造函数类想允许一个实例对于要使用的类,该类必须提供允许访问从该类内部创建的实例的静态方法或变量。)

class Alpha {

static String s = " ";

protected Alpha() { s += "alpha "; }

}

class SubAlpha extends Alpha {

private SubAlpha() { s += "sub "; }

}

public class SubSubAlpha extends Alpha {

private SubSubAlpha() { s += "subsub "; }

public static void main(String[] args) {

new SubSubAlpha();

System.out.println(s);

}

}

以上程序的输出将是

alpha子订阅

Nitesh Soomani answered 2020-02-08T15:33:10Z

4 votes

构造函数可以具有各种访问修饰符。 构造函数上不同的访问修饰符的用法不同。

如果要从任何位置实例化该类,则可以构造一个private的构造函数。

如果要继承该类并实例化其继承的类,则可以构造一个private的构造函数。

如果希望仅从其自身的成员实例化该类(通常是静态块或静态方法),则可以构造一个private构造函数。 这意味着您可以控制实例化类,并对实例化应用一些规则。 私有构造函数的使用示例是单例设计模式。

A.v answered 2020-02-08T15:33:45Z

4 votes

我同意先前的回答,即Singleton是具有私有构造函数的类的一个很好的例子。 但我建议使用其他实现:线程安全的Singleton:

/**

* Thread safe singleton

*/

public class Singleton {

private static volatile Singleton instance = null;

/**

* Private constructor

*/

private Singleton() {

}

/**

* Gets the Instance of the Singleton in a thread safe way.

* @return

*/

public static Singleton getInstance() {

if (instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

以线程安全的方式使用单例将减轻并行代码的痛苦。

Marc Giombetti answered 2020-02-08T15:34:11Z

3 votes

构造器在创建(例如)自定义工厂类时必须至少受保护甚至是私有的:

public final class MyFactory {

private MyFactory(){} // this one prevents instances of your factory

}

public static void doSomething(){} // access that with MyFactory.doSomething

请注意,这只是一个示例,显示了何时不应公开构造函数。

Arthur Eirich answered 2020-02-08T15:34:37Z

1 votes

这些答案大多数是针对单例或工厂类的。 私有构造函数的另一次出现是(例如)在java.lang.Math类中,那里的所有内容都是静态的,没有人可以调用该构造函数(包括类本身)。 通过使用私有构造函数,可以防止类之外的任何人调用该构造函数。 (这并不能阻止类内的某个人调用构造函数,但随后他们就违反了自己的规则。)

Teepeemm answered 2020-02-08T15:34:57Z

1 votes

其他人指出,构造函数可能具有访问修饰符。 尚未提及的一个方面是,构造函数上的aspect修饰符控制构造的两个截然不同的方面,但不允许分别对其进行控制:

允许谁创建Fnord foo = new Fnord(123);的实例以及允许使用哪些构造函数。

允许谁创建Fnord foo = new Fnord(123);的扩展以及允许使用哪些构造函数。

Java和.NET都要求这两个问题的答案必须同时存在。 如果一个类不是Fnord foo = new Fnord(123);(或Fnord foo = Fnord.Create(123);),并且允许外部代码使用构造函数来创建新实例,那么外部代码也将完全自由地使用相同的构造函数来创建派生类型。

在许多情况下,类仅具有package-private(Fnord foo = new Fnord(123);)构造函数,但公开返回新实例的公共方法可能是合适的。如果有人从头开始设计类似Fnord foo = Fnord.Create(123);的类型,则可以使用这种方法。包含Fnord的软件包可以将其定义为抽象类型,但包括具体派生类型,例如AsciiString和UCS16String,它们分别将其内容存储为byte[]和Char[];然后,根据字符串是否包含ASCII范围之外的字符,返回String的方法可以返回派生变量之一。如果String或任何派生类型都没有在其包之外公开任何构造函数,并且包中的所有派生类型都应表现为字符串,则收到引用String类型的引用的代码可能希望它作为字符串正常运行(例如,保证对其价值的任何观察将永远是正确的)。但是,将构造函数暴露在包之外会使派生类型表现出怪异而怪异的行为(例如,在检查和验证它​​们之后更改其内容)。

从语法角度来看,能够说Fnord foo = new Fnord(123);比必须说Fnord foo = Fnord.Create(123);好一点,但是需要后一种语法的类Fnord可以更好地控制对象创建过程。

supercat answered 2020-02-08T15:35:43Z

0 votes

简单的解释是,如果类中没有构造函数,则编译器会自动创建一个默认构造函数。

构造函数并不总是声明为public,它也可以是private,protected或default。

私有构造函数阻止类由其调用者完全清楚地表达/表示。 在这种情况下,私有构造函数很有用。 并且,如果不需要将我们的类进行子类化,则可以使用私有构造函数。

Nimishan answered 2020-02-08T15:36:13Z

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java private 构造函数_java-构造函数是否必须总是公开的? 的相关文章

  • Linux 查看磁盘空间

    1 查看当前目录的总大小 du sh ps du disk usage 2 查看某个目录的总大小 du sh 目录名 du后面可以跟的参数含义 a 列出所有的文件与目录容量 因为默认仅统计目录底下的文件量而已 h 以人们较易读的容量格式 G
  • Deep Learning 大体概念和事情

    0 深度学习为什么可能 因为一个事物的发生 其背后总有一个理型 或者叫做规律性 这个规律性就体现在原因与结果的作用关系里 把大多数原因和结果进行量化之后 结果与原因间存在一个数量关系方程 使得 结果 f 众原因 找出来这个大致的方程 f 便
  • 前端 Websocket + Stomp.js 的使用

    什么是Stomp STOMP即Simple or Streaming Text Orientated Messaging Protocol 简单 流 文本定向消息协议 它提供了一个可互操作的连接格式 允许STOMP客户端与任意STOMP消息
  • 【蓝桥OJ——C语言】顺子日期、特殊时间、乘积尾零

    文章目录 顺子日期 特殊时间 乘积尾零 总结 顺子日期 小明特别喜欢顺子 顺子指的就是连续的三个数字 123 456 等 顺子日期指的就是在日期的 yyyymmdd 表示法中 存在任意连续的三位数是一个顺子的日期 例如 20220123 就
  • 【Vue学习笔记】- 模板语法

    Vue模板语法分为两大类 插值语法 指令语法 插值语法 功能 作用于标签体内 目的是解析内容 写法 xxx xxx 是js表达式或data中的数据 指令语法 功能 作用于标签自身 可解析 标签属性 标签体内容 绑定事件 举例 v bind
  • java调第三方接口

    目录 背景 Spring的RestTemplate 1 引入依赖 2 RestTemplate配置类 3 RestTemplate实现类 背景 java调第三方接口我百度的有三种方法 第一种 通过JDK网络类Java net HttpURL
  • SpringBoot jar包的部署方式

    centos版本 CentOS Linux release 7 6 1810 Core JDK1 8 一 SpringBoot jar包的部署方式 nohup 后台进程形式 Linux脚本 启动形式 systemd 优雅系统服务形式 sys
  • Tomcat的日志切分和定时删除

    在我负责的一个小系统中 Linux环境下 由于默认日志都是写入在 cattalina out中 我查看日志catalina out 竟然已经到了 40G了 我想做一下 文件内容检索来追踪问题都无法进行 于是我决定删除以前的无用日志 以每日作
  • Qt 与外部exe进程间通信-基于操作系统的消息传递

    步骤 进程A 通过WindowAPI找到需要传递信息的窗口 然后通过windowAPI发送自定义的消息 其实本质上还是window操作系统定义的消息结构 只不过其中有个字段的值被设置成了自己特有的值 const ULONG PTR CUST
  • Java分割字符串(spilt())

    String 类的 split 方法可以按指定的分割符对目标字符串进行分割 分割后的内容存放在字符串数组中 该方法主要有如下两种重载形式 str split String sign str split String sign int lim
  • 学好了Python可以干什么?

    随着我国对编程的重视程度上升 Python编程的学习趋势逐渐低龄化 在全国掀起Python编程热的同时 还是有许多人对于学习Python抱有怀疑 那么我们就来看看学好了Python究竟可以干什么 根据目前就业市场的反馈 我们可以看到Pyth
  • Cscope的使用

    转载自 http blog csdn net dengxiayehu article details 6330200 首先在目录下建立cscope索引文件 find name c gt cscope file cscope Rbkq 这个命
  • ST芯片使用串口 + DMA接收 + 空闲中断处理,有USART1和LPUART

    普通串口 USART1 首先是DMA初始化 DMA初始化 void MX DMA Init void Init with LL driver DMA controller clock enable LL AHB EnableClock LL
  • 最新淘宝主图下载方法-最新淘宝主图下载工具-马赛克视频助手

    做电商的朋友经常需要去下载淘宝上的别人的主图视频 那么淘宝主图视频怎么下载呢 工具 材料 马赛克视频助手 免费工具 www mask4 com 大家自行下载 操作方法 1 先打开马赛克视频助手 2 随便打开一个淘宝主图地址 如果是手机端的朋
  • ORA-00937: not a single-group group function说明及解决方法

    A SELECT list cannot include both a group function such as AVG COUNT MAX MIN SUM STDDEV or VARIANCE and an individual co
  • uni-app调用手机摄像头进行扫码

  • 放弃node-sass,启用sass

    在下载一个新项目时运行 npm run install 发现报错 npm uninstall 异常 Error Could not find any Visual Studio installation to use 或是 You need
  • 滑动平均滤波

    滑动平均滤波是一种常用的数字信号处理技术 它可以有效地去除信号中的噪声 提高信号的质量 滑动平均滤波的原理是对信号的每一个采样点 取其周围的若干个点的平均值作为滤波后的值 这样 信号中的随机噪声会被平均掉 而信号中的有用信息会被保留 用C语

随机推荐