黑马程序员技术交流社区

标题: 私有化及构造函数的细节问题 [打印本页]

作者: 夏儒日    时间: 2012-7-3 18:51
标题: 私有化及构造函数的细节问题
下面程序是毕老师视频里面的一个例子,关于私有化的一个细节问题,不是很明白.毕老师说将Person类的构造函数Person(String name)改为private Person(String name)后,则不能建立Person对象,说是因为对应的构造函数已经被初始化.不是很明白......谁能帮忙解释下?谢谢

class Person
{
        private String name;
        private int age;
        Person(String name)   //改为private Person(String name)
        {
                this.name=name;
        }
        Person(String name,int age)
        {
                this(name);
                this.age=age;
        }
        public void speak()
        {
                System.out.println("name="+name+" ; "+"age="+age);
        }
}
class  PersonDemo10
{
        public static void main(String[] args)
        {
                Person p=new Person("xiaruri");
                p.speak();
        }
}
作者: 韦念欣    时间: 2012-7-3 18:58
本帖最后由 韦念欣 于 2012-7-3 19:06 编辑

当构造函数设为私有后,这个类就只能在本类中new对象,在其他的类中是不能使用的。
这样做可以实现单例模式,也就是自己写一个获取对象的静态方法。
单例模式有两种写法,一种是饿汉式,一种是懒汉式,其中懒汉式存在多线程的安全问题,不推荐使用。

  1. //饿汉式
  2. class Single
  3. {                        
  4.          private static Single s = new Single();

  5.          private Single() {}

  6.          public static Single getInstance()
  7.          {
  8.                 return s;
  9.          }            
  10. }

  11. //懒汉式-(存在多线程安全问题)
  12. class Single
  13. {                        
  14.         private static Single s;

  15.         private Single() {}

  16.         public static Single getInstance()
  17.          {
  18.                     if(s==null)
  19.                     {
  20.                         s = new Single();
  21.                     }               
  22.                     return s;
  23.         }            
  24. }
复制代码

作者: 贾飞雨    时间: 2012-7-3 18:58
构造方法的作用就是建立对象并对其初始化,而用private修饰之后,对应的构造方法就被私有化,也就是只可以本类调用,如果你在别的类建立对应的对象的话,就不可以了
比如像楼主说的Person(String name)   //改为private Person(String name),在这里对其私有化,那么下面 Person p=new Person("xiaruri");这个调用的就是私有化的构造,
你都调用不了还怎么建立呢,如果你这样 Person p=new Person("xiaruri",20);就会调用这个构造方法  Person(String name,int age)
        {
                this(name);
                this.age=age;
        }
也就可以建立了对象了,
作者: 邵阳    时间: 2012-7-3 19:13
楼主可能听错啦,不是初始化,是私有化吧
作者: 黑马-王言龙    时间: 2012-7-3 23:06
对应的构造函数已经被私有化

创建对象要new Person()
new后面的Person()是构造函数,即调用了构造函数来创建对象
你Person()被私有后,别的类是不能使用的,也就创建不了对象了。
作者: 黄丽慧    时间: 2012-7-4 10:33
本帖最后由 黄丽慧 于 2012-7-4 11:12 编辑

当类的构造方法被私有化时,其他的类是没有办法创建该类的对象的。因为创建对象时构造函数就会被自动调用,既然构造函数被私有了那也就没有办法创建对象了。但是一个类没办法创建对象并不意味着,该类中的数据和方法不能被使用,此时可以把该类的成员定义成static类型。
class Person
{
        private String name;
        private int age;
        Person(String name)   //改为private Person(String name)
        {
                this.name=name;
        }
        Person(String name,int age)
        {
                this(name);
                this.age=age;
        }
       //并写两个函数来设置姓名和年龄
        public static void setName(string name)
{
        this.name=name;
}
public static void setAge(int age)
{
         this.age=age;
}
        public void speak()//改为public static void speak()然后在主方法中通过类名来调用
        {
                System.out.println("name="+name+" ; "+"age="+age);
        }
}
class  PersonDemo10
{
        public static void main(String[] args)
        {
                Person p=new Person("xiaruri");// Person(String name)被私有化以后,是没有办法创建对象的
                p.speak();//把上面这两句改为
                Person.setName("lilei");
                Person.setAge(25);
                Person.speak();
        }
}
作者: 黄丽慧    时间: 2012-7-4 11:11
黄丽慧 发表于 2012-7-4 10:33
当类的构造方法被私有化时,其他的类是没有办法创建该类的对象的。因为创建对象时构造函数就会被自动调用, ...

版主真的是相当细心额
作者: 向向    时间: 2012-7-19 02:28
黄丽慧 发表于 2012-7-4 11:11
版主真的是相当细心额

怎么细心了?




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