黑马程序员技术交流社区

标题: 生成了几个Singel类对象? [打印本页]

作者: wupingtanlu    时间: 2012-5-13 00:15
标题: 生成了几个Singel类对象?
class Single

{  private int num;

        public void setNum(int num)

        {        this.num=num;

        }

        public int getNum()

        {

                return num;

        }

         Single(){}

        private static Single s =new Single();

}

class SingleDemo

{

        public static void main (String[]args)

        {

        Single s1=new Single();

        Single s2=new Single();

        s1.setNum(30);

        System.out.println(s2.getNum());

       }

}

请问 类中有private static Single s =new Single();的语句能不能算是单列呢?,请问这个s是在方法区还是堆内存中? 这个程序总共创建了几个对象?谁介绍下创建的几个对象的先后顺序,说下创建这几个对象的先后步骤呢?

作者: 黑马罗坚    时间: 2012-5-13 00:21
1次 static 修饰的成员只在类加载时执行一次
作者: 黑马-王建雨    时间: 2012-5-13 00:23
1,不算单例。
2,S在方法区。
3,三个对象。
4,对象顺序:s   s1   s2
作者: 田林    时间: 2012-5-13 09:36
类中有private static Single s =new Single();的语句不能算是单例,因为还可以继续生成新的Single对象。
s应该属于静态变量,在方法区中。
这个对象总共创造了三个对象:s,s1,s2.
最先创建的是对象s,在类Single被虚拟机加载的时候创建。然后根据程序执行顺序是s1,接着是s2.
s,s1,s2三个中存放的是对象在堆中的地址,并且它们三个地址值都不一样。
作者: It's_Zero    时间: 2012-5-13 10:12
单例代表只有一个对象,每创建一个对象都要通过new 操作来执行构造函数对所需要创建的对象进行初始化,
而你类里面的构造函数是默认修饰  非 private私有修饰,所以在SingleDemo 可以通过new Single();操作new出N个对象
把构造函数私有化,并返回对象的get方法
根据毕老师所说的俩种单例模式  我说说其中使用一点的饿汉式:
  1. class Single{
  2.         private int num;
  3.         private static Single s = new Single();

  4.         public void setNum(int num){
  5.                 this.num = num;
  6.         }

  7.         public int getNum(){
  8.                 return num;
  9.         }
  10.        
  11.         private Single() {}
  12.        
  13.         public static Single getSingle(){
  14.                 return s;
  15.         }
  16. }

  17. class SingleDemo{

  18.         public static void main(String[] args){
  19.                 Single s1 =Single.getSingle();
  20.                 Single s2 = Single.getSingle();
  21.                 s1.setNum(30);
  22.                 System.out.println(s2.getNum());
  23.                 }
  24. }
复制代码

作者: 高鑫    时间: 2012-5-13 22:28
总共3个对象,兄弟,这个问题我以前也问过private static Single s =new Single();这句在Single类中,当你在主函数中new Single()的时候,这个类就加载进内存,所以private static Single s =new Single();是最先创建的对象。
作者: 程旦    时间: 2012-5-13 22:35
老问题了  3个 先是静态变量s  只加载一次  然后是俩个对象s1 s2




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