A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 曹宇 于 2013-3-28 23:29 编辑

如题。下面的代码是毕老师的视频教学中讲的单例设计的代码,其中我就疑惑在这,既然构造函数叫私有化了,那么就代表不能创建对象。
在老师的代码中,在其他类是不能创建对象的,可是在这个被私有构造函数的类中,可以创建本类对象。
我想知道,这是为什么呢?构造函数叫私有化了,这个对象是如何创建完成的呢?
谢谢了!
  1. class Test
  2. {
  3.         private static int num;
  4.         private Test(){}   //私有了构造函数
  5.         
  6.         /*
  7.          创建对象不是需要构造函数吗?构造函数叫干掉了,为什么在本类中还能创建本类对象呢?
  8.         */
  9.         private static Test t=new Test();    // 创建本类对象
  10.                
  11.         public static Test getTest()           //给这个对象给外界提供访问方式,返回值类型是 Test(类)类型
  12.         {               
  13.                 return t;
  14.         }
  15.         public void setNum(int num)
  16.         {
  17.                 this.num=num;
  18.         }
  19.         public int getNum()
  20.         {
  21.                 return num;
  22.         }
  23. }
  24. class Print
  25. {
  26.         public static void main(String[] args)
  27.         {        
  28.                 Test t2=Test.getTest();         //将对象t的引用赋值给t2
  29.                 t2.setNum(20);
  30.                 System.out.println(t2.getNum());
  31.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

12 个回复

倒序浏览
私有函数变量,在本类中都是可以创建对象调用的吧!私有化构造函数,为了提高构造函数的安全性,当外部类调用这个类里面的函数时,构造函数里面的变量不会受影响!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 25分咯~~~

查看全部评分

回复 使用道具 举报
于腾飛 发表于 2013-3-28 23:23
私有函数变量,在本类中都是可以创建对象调用的吧!私有化构造函数,为了提高构造函数的安全性,当外部类调 ...

奥,也就是说,这是JAVA语言本身就规定的,当构造函数被私有化了之后,就只能在本类中创建了?

。。我以为是什么技巧,然后绕过啥啥啥的。原来是叫我想复杂了,其实本来就是JAVA提供的。

受教了,谢谢了!

点评

你还没有完全理解四个访问权限修饰符,***ate修饰并不是不能创建对象,而是把构造私有化,使用***ate修饰构造方法的类只有本类可以new对象。其他...  发表于 2021-4-26 10:50
回复 使用道具 举报
构造函数被私有修饰后,不可以创建对象是针对在除本类外的其他类中不可创建

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
构造函数私有化后,只是本类以外的类不能创建对象,可本类还是可以创建对象的。
  1. private static Test t=new Test();
复制代码
通过static修饰,只要类一加载就创建对象,且只有一个对象,避免创建多个对象。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
hacket 发表于 2013-3-28 23:46
构造函数私有化后,只是本类以外的类不能创建对象,可本类还是可以创建对象的。通过static修饰,只要类一加 ...

恩,谢谢,我明白了。一开始没想到是JAVA自身就允许这样做,我以为是什么技巧,然后绕过啥啥啥的。原来是叫我想复杂了,其实本来就是JAVA提供的。
回复 使用道具 举报
曹宇 中级黑马 2013-3-29 01:01:44
7#
1170531562 发表于 2013-3-28 23:30
构造函数被私有修饰后,不可以创建对象是针对在除本类外的其他类中不可创建 ...

恩,谢谢,这下明白了,受教了。
回复 使用道具 举报
  1. package shiyan;

  2. import java.lang.reflect.Constructor;

  3. class Test

  4. {

  5.         private static int num;

  6.         private Test(){}   //私有了构造函数
  7.         private static Test t=new Test();    // 创建本类对象
  8.         public static Test getTest()           //给这个对象给外界提供访问方式,返回值类型是 Test(类)类型
  9.         {               
  10.                 return t;
  11.         }
  12.         public void setNum(int num)
  13.         {
  14.                 this.num=num;
  15.         }

  16.         public int getNum()
  17.         {
  18.                 return num;
  19.         }
  20. }


  21. public class Reflect {

  22.         public static void main(String[] args) throws Exception{
  23.                 Constructor c=Class.forName("shiyan.Test").getDeclaredConstructor();
  24.                 c.setAccessible(true);
  25.                 Test t2= (Test)c.newInstance();
  26.                 t2.setNum(20);
  27.                 System.out.println(t2.getNum());

  28.         }

  29. }

复制代码
看了这个帖子忽然就想到暴力反射去了:L
附上一段代码,板砖轻点......

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
感谢8L 关于反射一直想找个现成的东西看下 受教。

构造函数私有化后,只是本类以外的类不能创建对象,可本类还是可以创建对象的 引用 4L

或想在本类外创建该对象的实例,除了你提供的代码,后期还可以参阅8L 的劳动成果。8L 你没白忙活。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
恩 谢谢 8L和 9L       8L的代码有些地方没学过没看懂,不过保存下来, 后面学的东西多了在拿回来看。。

谢谢啦。
回复 使用道具 举报
给你举一个简单的例子,一间屋子锁上门以后,别人就不能进去拿这个拿那个,但是屋子的主人在里面可以随便操作。这是老师说的很好理解 的例子
回复 使用道具 举报
李海鹏 发表于 2013-3-30 12:20
给你举一个简单的例子,一间屋子锁上门以后,别人就不能进去拿这个拿那个,但是屋子的主人在里面可以随便操 ...

恩,确实,你这样一说很明了 了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马