java中构造方法私有化
2015-08-13 08:44
686 查看
1. 类中的封装性不光体现在对属性的封装上,实际上方法也是可以被封装的,当然在方法封装中也包含了对构造方法的封装。
举例:
public class GzPrivate2 {
public static void main(String[] args) {
//声明对象,不会报错
Singleton s = null;
//实例化对象,调用了私有化的构造方法,程序报错
s = new Singleton();//错误,无法实例化对象
}
}
class Singleton{
private Singleton(){
//将构造方法进行了封装,私有化,这时候此构造方法只能在本类中可见!
}
public void prit(){
System.out.println("nishuibaichuan");
}
}
以上程序运行报错!因为此类Singleton中的构造方法被私有化了,只能在本类Singleton中可见,不能再外部直接实例化!
既然再外部不可用,那么我们就在内部使用!
举例:
public class GzPrivate {
public static void main(String[] args) {
//声明对象,不会报错
Singleton1 s = null;
}
}
class Singleton1{
//在内部产生本类的实例化对象
Singleton1 singleton1 = new Singleton1();
private Singleton1(){
//将构造方法进行了封装,私有化,这时候此构造方法只能在本类中可见!
}
public void prit(){
System.out.println("nishuibaichuan");
}
}
由上代码可知,当构造方法在其类中被私有化,那么就只能在其本类内部中实例化对象了!
2.把在内部实例化的对象拿到外部类,这样外部就可以直接通过此对象实例化了。正常情况下,在1中可以知道 singleton1属性只能通过Singleton类的实例化对象才能调用,如果在没有实例化对象的时候依然可以取得singleton1对象,则就需要singleton1声明为static访问类型,因为它不仅让所有对象共享,更重要的是它可以直接通过使用类名称进行访问!
举例:
public class GzPrivate4 {
public static void main(String[] args) {
Singleton3 s1 = null;//声明对象
s1 = Singleton3.getSingleton3();//用类名称.对象名,来给s1赋值
s1.fun();
}
}
class Singleton3{
//实例化s静态对象
private static Singleton3 s = new Singleton3();
public static Singleton3 getSingleton3(){
return s;
}
private Singleton3(){
System.out.println("NISHUIBAICHUAN");
}
public void fun(){
System.out.println("nishuibaichuan");
}
}
运行结果:
NISHUIBAICHUAN
nishuibaichuan
构造方法私有化之后,就可以通过以上的形式取得实例化对象。
程序的意义:先看如下代码
public class GzPrivate4 {
public static void main(String[] args) {
Singleton3 s1 = null;//声明对象
Singleton3 s2 = null;//声明对象
Singleton3 s3 = null;//声明对象
s1 = Singleton3.getSingleton3();//用类名称.对象名,来给s1赋值
s2 = Singleton3.getSingleton3();//用类名称.对象名,来给s2赋值
s3 = Singleton3.getSingleton3();
s1.fun();
s2.fun();
s3.fun();
}
}
class Singleton3{
//实例化s静态对象
private static Singleton3 s = new Singleton3();
public static Singleton3 getSingleton3(){
return s;
}
private Singleton3(){
System.out.println("NISHUIBAICHUAN");
}
public void fun(){
System.out.println("nishuibaichuan");
}
}
运行结果:
NISHUIBAICHUAN
nishuibaichuan
nishuibaichuan
nishuibaichuan
由上代码可知:不管外部声明了多少个Singleton4的对象,但是最终结果都是通过getSingleton4()方法取得的实例化对象,也就是说,此时的s1,s2,s3实际上都使用了一个对象的引用:s;因为他说static类型,为所有对象所共享的!
那么以上的设计模式是属于单态设计模式(单例设计模式):Singleton4
如果现在不希望一个类产生过多的对象的话,则就必须使用单态设计模式,而且使用
单态设计模式在以后的java学习中会经常遇到,因为在java的支持类库中,大量的采用了此种设计模式。
所谓的单态就是在入口处(构造方法)限制了对象的实例化操作。
总结:单态设计模式的核心就是将类中的构造方法私有化,之后在类的内部产生实例化对象,并可通过该类的静态方法返回实例化对象的引用。
举例:
public class GzPrivate2 {
public static void main(String[] args) {
//声明对象,不会报错
Singleton s = null;
//实例化对象,调用了私有化的构造方法,程序报错
s = new Singleton();//错误,无法实例化对象
}
}
class Singleton{
private Singleton(){
//将构造方法进行了封装,私有化,这时候此构造方法只能在本类中可见!
}
public void prit(){
System.out.println("nishuibaichuan");
}
}
以上程序运行报错!因为此类Singleton中的构造方法被私有化了,只能在本类Singleton中可见,不能再外部直接实例化!
既然再外部不可用,那么我们就在内部使用!
举例:
public class GzPrivate {
public static void main(String[] args) {
//声明对象,不会报错
Singleton1 s = null;
}
}
class Singleton1{
//在内部产生本类的实例化对象
Singleton1 singleton1 = new Singleton1();
private Singleton1(){
//将构造方法进行了封装,私有化,这时候此构造方法只能在本类中可见!
}
public void prit(){
System.out.println("nishuibaichuan");
}
}
由上代码可知,当构造方法在其类中被私有化,那么就只能在其本类内部中实例化对象了!
2.把在内部实例化的对象拿到外部类,这样外部就可以直接通过此对象实例化了。正常情况下,在1中可以知道 singleton1属性只能通过Singleton类的实例化对象才能调用,如果在没有实例化对象的时候依然可以取得singleton1对象,则就需要singleton1声明为static访问类型,因为它不仅让所有对象共享,更重要的是它可以直接通过使用类名称进行访问!
举例:
public class GzPrivate4 {
public static void main(String[] args) {
Singleton3 s1 = null;//声明对象
s1 = Singleton3.getSingleton3();//用类名称.对象名,来给s1赋值
s1.fun();
}
}
class Singleton3{
//实例化s静态对象
private static Singleton3 s = new Singleton3();
public static Singleton3 getSingleton3(){
return s;
}
private Singleton3(){
System.out.println("NISHUIBAICHUAN");
}
public void fun(){
System.out.println("nishuibaichuan");
}
}
运行结果:
NISHUIBAICHUAN
nishuibaichuan
构造方法私有化之后,就可以通过以上的形式取得实例化对象。
程序的意义:先看如下代码
public class GzPrivate4 {
public static void main(String[] args) {
Singleton3 s1 = null;//声明对象
Singleton3 s2 = null;//声明对象
Singleton3 s3 = null;//声明对象
s1 = Singleton3.getSingleton3();//用类名称.对象名,来给s1赋值
s2 = Singleton3.getSingleton3();//用类名称.对象名,来给s2赋值
s3 = Singleton3.getSingleton3();
s1.fun();
s2.fun();
s3.fun();
}
}
class Singleton3{
//实例化s静态对象
private static Singleton3 s = new Singleton3();
public static Singleton3 getSingleton3(){
return s;
}
private Singleton3(){
System.out.println("NISHUIBAICHUAN");
}
public void fun(){
System.out.println("nishuibaichuan");
}
}
运行结果:
NISHUIBAICHUAN
nishuibaichuan
nishuibaichuan
nishuibaichuan
由上代码可知:不管外部声明了多少个Singleton4的对象,但是最终结果都是通过getSingleton4()方法取得的实例化对象,也就是说,此时的s1,s2,s3实际上都使用了一个对象的引用:s;因为他说static类型,为所有对象所共享的!
那么以上的设计模式是属于单态设计模式(单例设计模式):Singleton4
如果现在不希望一个类产生过多的对象的话,则就必须使用单态设计模式,而且使用
单态设计模式在以后的java学习中会经常遇到,因为在java的支持类库中,大量的采用了此种设计模式。
所谓的单态就是在入口处(构造方法)限制了对象的实例化操作。
总结:单态设计模式的核心就是将类中的构造方法私有化,之后在类的内部产生实例化对象,并可通过该类的静态方法返回实例化对象的引用。
相关文章推荐
- 杭电ACM2045java做法
- java工程师分享:我是如何自学成才的?
- struts2由<s:tree>要么dtree小工具 建立树
- MonkeyTalk Java API 使用教程
- java的wait和notify
- java基本语法
- java基本语法
- eclipse最有用快捷键整理
- eclipse最有用快捷键整理
- Java/JSP使用JNI技术调用本地动态链接库
- java ------ IO(从基础到加强)
- Spring+mybatis+struts框架整合的配置详解
- Java并发编程实战笔记(一):线程安全性
- JAVA正则表达式 Pattern和Matcher
- Java - 复制ArrayList
- SPRING3 JUNIT TEST ERROR
- 编译工程时报java:[1,0] illegal character: \65279问题排查与解决过
- 关于springmvc工作流程
- eclipse的访问控制图标详解
- eclipse中的.project 和 .classpath文件的具体作用