黑马程序员技术交流社区

标题: 构造函数私有化了,为什么还能创建对象? [打印本页]

作者: 曹宇    时间: 2013-3-28 23:07
标题: 构造函数私有化了,为什么还能创建对象?
本帖最后由 曹宇 于 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.         }
复制代码

作者: 于腾飛    时间: 2013-3-28 23:23
私有函数变量,在本类中都是可以创建对象调用的吧!私有化构造函数,为了提高构造函数的安全性,当外部类调用这个类里面的函数时,构造函数里面的变量不会受影响!
作者: 曹宇    时间: 2013-3-28 23:29
于腾飛 发表于 2013-3-28 23:23
私有函数变量,在本类中都是可以创建对象调用的吧!私有化构造函数,为了提高构造函数的安全性,当外部类调 ...

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

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

受教了,谢谢了!

作者: 赵喜平    时间: 2013-3-28 23:30
构造函数被私有修饰后,不可以创建对象是针对在除本类外的其他类中不可创建
作者: hacket    时间: 2013-3-28 23:46
构造函数私有化后,只是本类以外的类不能创建对象,可本类还是可以创建对象的。
  1. private static Test t=new Test();
复制代码
通过static修饰,只要类一加载就创建对象,且只有一个对象,避免创建多个对象。
作者: 曹宇    时间: 2013-3-29 01:01
hacket 发表于 2013-3-28 23:46
构造函数私有化后,只是本类以外的类不能创建对象,可本类还是可以创建对象的。通过static修饰,只要类一加 ...

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

恩,谢谢,这下明白了,受教了。
作者: 王人超    时间: 2013-3-29 22:48
  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
附上一段代码,板砖轻点......

作者: 贺靖轩    时间: 2013-3-29 23:03
感谢8L 关于反射一直想找个现成的东西看下 受教。

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

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

作者: 曹宇    时间: 2013-3-30 11:21
恩 谢谢 8L和 9L       8L的代码有些地方没学过没看懂,不过保存下来, 后面学的东西多了在拿回来看。。

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

恩,确实,你这样一说很明了 了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2