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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文密 中级黑马   /  2012-4-8 13:04  /  4074 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//构造方法私有
class Person
        {
         String name;
        private static final Person p=new Person();
   
         private Person()
    {
     name="anhngsan";

        }
    public static Person getP()
   {
      return p;
    }

}

class Demo1{
        public static void main(String[] args)
        {
        Person p=null;
        p=Person .getP();
        System.out.println(p.name)
        }

}

程序中23行中的p和24行中的p是不是同一个p,而且在这儿申明一个Person对象有什么作用,程序的24行调用了12—15行之间的代码,然后又是通过什么调用5—9行之间的代码来实现第26的代码的,看了好半天没弄明白

6 个回复

正序浏览
pray 高级黑马 2014-4-26 05:33:14
7#
让人看完后就要往上顶往死里顶的好帖
回复 使用道具 举报
确实这是一个单例设计模式,person这个类不能new 一个新的对象出来只能通过getp()方法调用你person中事先创建的那个对象。
23行中的p和24行中的p是同一p只不过他的值发生了变化,还有Person p=null;这句话并不是创建person对象的,只是定义了一个Person类型的变量p,并且赋值是空。

回复 使用道具 举报
亲,你这是单例设计模式    换个马甲就不认识了?
回复 使用道具 举报


  1. class Person
  2.         {
  3.         String name;
  4.         private static final Person p=new Person();
  5.    
  6.     private Person()
  7.     {
  8.      name="anhngsan";
  9.     }
  10.     public static Person getP()
  11.    {
  12.       return p;
  13.     }

  14. }

  15. class Demo1{
  16.         public static void main(String[] args)
  17.         {
  18.         Person p=null;//创建了Person类的一个引用p,这个p不指向任何实例。
  19.         p=Person .getP();//因为Person类的构造函数私有化了,所以不能new它的对象,但它内部有
  20.                 //一个对象,并且还提供了一个getP()方法来让外部通过这个方法获取已经建立好的对象。
  21.                 //这个已经建立好的对象是什么样子的呢?它是在类内部创建的,存在于静态区中,创建的时候,用到了私有的
  22.                 //构造函数private Person(),在这个函数中,将这个唯一的对象,name属性的值改为了“anhngsan”
  23.                 //所以外部调用这个对象name时,就会打印“anhngsan”
  24.         System.out.println(p.name)
  25.         }

  26. }

  27. //在这个Person类中,它私有化了构造函数,外部无法new它的对象,Person.getP()是唯一获取Person对象的方式了,
  28. //这样的类只有一个对象,外部对它对象的操作都只能是同一个并唯一的对象,如果像更多了解这种模式。可以去
  29. //了解一下单例设计模式,相信了解了单例设计模式之后,您的疑问也会迎刃而解了。
复制代码
回复 使用道具 举报
两个P不是同一个P,因为Person p = null ;只是在占内存中声明了一个p,还没有通过new关键字来开辟堆内存空间,是个引用,
第二个p是通过Person类中的静态方法getP()得到的,返回类型是Person,相当于是给第一个前一句中的那个p赋值,声明一个Person对象是因为静态方法getP()的返回类型是Person类型的,方便赋值。
同时由于Person的构造函数是私有的,不能在外部直接生产Person类的对象实例,所以只有通过静态方法getP()来为第一个p赋值。
不知道这样讲你是否明白点了
回复 使用道具 举报

//构造方法私有
class Person
        {
         String name;
        private static final Person p=new Person();
   
         private Person()
    {
     name="anhngsan";

        }
    public static Person getP()//3调用方向返回对象
   {
      return p;//4
    }

}

class Demo1{
        public static void main(String[] args)
        {
        Person p=null; //1引用型变量p指向空
        p=Person .getP();//2类名.静态方法获取对象        p//5p指向对象
        System.out.println(p.name)//6对印成员变量name
        }

}

//程序中23行中的p和24行中的p是不是同一个p,而且在这儿申明一个Person对象有什么作用,程序的24行调用了12—15行之间的//代码,然后又是通过什么调用5—9行之间的代码来实现第26的代码的,看了好半天没弄明白
23行的p和24的p是同一个p,但是所指向的引用却不同,一个是null,一个是对象在堆内存中的p。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马