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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏儒日 中级黑马   /  2012-7-3 18:51  /  2429 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面程序是毕老师视频里面的一个例子,关于私有化的一个细节问题,不是很明白.毕老师说将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-4 10:53

7 个回复

倒序浏览
本帖最后由 韦念欣 于 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. }
复制代码
回复 使用道具 举报
构造方法的作用就是建立对象并对其初始化,而用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;
        }
也就可以建立了对象了,
回复 使用道具 举报
楼主可能听错啦,不是初始化,是私有化吧
回复 使用道具 举报
对应的构造函数已经被私有化

创建对象要new Person()
new后面的Person()是构造函数,即调用了构造函数来创建对象
你Person()被私有后,别的类是不能使用的,也就创建不了对象了。
回复 使用道具 举报
本帖最后由 黄丽慧 于 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 10:49

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黄丽慧 发表于 2012-7-4 10:33
当类的构造方法被私有化时,其他的类是没有办法创建该类的对象的。因为创建对象时构造函数就会被自动调用, ...

版主真的是相当细心额
回复 使用道具 举报
向向 黑马帝 2012-7-19 02:28:16
8#
黄丽慧 发表于 2012-7-4 11:11
版主真的是相当细心额

怎么细心了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马