Java私有构造器使用方法示例

发布时间 - 2026-01-11 03:14:06    点击率:

构造器作为Java类的一个特殊的成员同样可以设置关键字来控制其访问权限。在大多数情况下,我们一般把构造器设置为公有成员,即public的,在默认情况下,如果不写任何关键字,其访问权限也是public。这样,在我们新建一个类的对象的时候,构造器会创建对象后被自动调用,发生在其他类成员被设置为默认初始值之后,当然如果有字段初始器和初始化块的话,构造器的调用会发生在此之后。构造器的主要作用是在new将对象的引用返回之前初始化对象。

言归正传,什么叫私有构造器。所谓私有构造器,就是用private关键字声明的构造器,即使用private关键字声明的构造函数。。与一般公有构造器最大的区别在于,其访问权限是private,于是它只能被包含它的类自身所访问,而无法在类的外部调用,故而可以阻止对象的生成。所以,如果一个类只有一个私有构造器,而没有任何公有构造器,是无法生成任何对象的。

由于类的构造函数时私有的,所以此类不能被实例化,同时也不能被继承。《Effective Java》第三条:用私有构造器或者枚举强化Singleton属性。所谓Singleton属性是指仅仅被实例化一次的类。第四条:通过私有构造器强化不可实例化的能力。在Java中实现Singleton有两种方式:

public class Elvis {
 public static final Elvis INSTANCE = new Elvis();
 private Elvis() {}
}

public class Elvis {
 private static final Elvis INSTANCE = new Elvis();
 private Elvis() {}
 public static Elvis getInstance() { return INSTANCE;}
}

方法一:私有构造函数只能被调用一次,用来实例化公有的静态final域Elvis.INSTANCE,一旦Elvis被实例化,只会存在一个Elvis实例(享有特权的客户端可以借助AccessibleObject.setAccessible方法通过反射机制调用私有构造器);

方法二:使用静态方法getInstance返回对同一个对象的引用,永远不会创建其他Evlis实例。

为什么需要私有构造器,如果类不能被实例化该怎么使用这个类的方法?

私有构造器的存在可以让某些类不能被实例化和子类化,这些类通常是一些工具类,例如java.lang.Math等,访问这些类的方法我们可以定义公有的静态方法来实现,如A.methon()

public class A {
 private A() {}
 public static void methon() {}    
}

java.lang.Math中私有构造器的使用,可以看到Math类被定义为final的,使用了private的构造函数,它的方法都是static的,所以调用其方法只需要Math.sin(x)即可:

public final class Math {
 private Math() {}
 public static final double E = 2.7182818284590452354;
 public static final double PI = 3.14159265358979323846;
 public static double sin(double a) {
  return StrictMath.sin(a); // default impl. delegates to StrictMath
 } 
 public static double cos(double a) {
  return StrictMath.cos(a); // default impl. delegates to StrictMath
 }
 public static double tan(double a) {
  return StrictMath.tan(a); // default impl. delegates to StrictMath
 }
 ......
 public static float scalb(float f, int scaleFactor) {
  return sun.misc.FpUtils.scalb(f, scaleFactor);
 }
}

希望本文所述Java编程私有构造器的内容对大家有所帮助!


# java  # 私有构造器  # 私有化构造器  # Java基础教程之构造器与方法重载  # 通过实例了解java spring使用构造器注入的原因  # Java构造器使用方法及注意事项  # 实例解析Java中的构造器初始化  # Java 构造器原理及用法解析  # java 页面url传值中文乱码的解决方法  # java中文传值乱码问题的解决方法  # javascirpt实现2个iframe之间传值的方法  # java及C++中传值传递、引用传递和指针方式的理解  # Java构造器与传值学习总结  # 访问权限  # 设置为  # 都是  # 是在  # 子类  # 在此  # 没有任何  # 是指  # 我们可以  # 只会  # 言归正传  # 可以看到  # 此类  # 只有一个  # 只需要  # 什么叫  # 有两种  # 该怎么  # 永远不会  # 来实现 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  韩国服务器如何优化跨境访问实现高效连接?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  简单实现Android验证码  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Linux网络带宽限制_tc配置实践解析【教程】  Laravel如何使用Livewire构建动态组件?(入门代码)  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Android自定义控件实现温度旋转按钮效果  C#如何调用原生C++ COM对象详解  奇安信“盘古石”团队突破 iOS 26.1 提权  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在IIS管理器中快速创建并配置网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  C++时间戳转换成日期时间的步骤和示例代码  php结合redis实现高并发下的抢购、秒杀功能的实例  nodejs redis 发布订阅机制封装实现方法及实例代码  在Oracle关闭情况下如何修改spfile的参数  如何快速查询网址的建站时间与历史轨迹?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Windows Hello人脸识别突然无法使用  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel如何处理CORS跨域请求?(配置示例)  手机软键盘弹出时影响布局的解决方法  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速上传自定义模板至建站之星?  如何在万网利用已有域名快速建站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何用IIS7快速搭建并优化网站站点?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何在阿里云香港服务器快速搭建网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何用5美元大硬盘VPS安全高效搭建个人网站?  *服务器网站为何频现安全漏洞?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南