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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-3 09:36  /  2387 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • 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-7-3 11:01

7 个回复

倒序浏览
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(); //这里面你需要看看毕老师的视频里面讲的很清楚,static 修饰的放在方法区里面,这里创建一个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());
        }
}
回复 使用道具 举报
3个对象
回复 使用道具 举报
首先回答你s的位置是在方法区
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
如果你对JVM内存的分配机制感兴趣,我找到了一篇很不错的文章推荐你看看,地址如下
http://www.cnblogs.com/kkcheng/archive/2011/02/25/1964521.html

第二,你写的代码最终一共创建了三个对象
首先,静态变量s被创建,其次是s1,最后是s2
为了方便理解,我将你的代码改写如下,你运行一下就知道了
public class Single {
        private int num;

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

        public int getNum(){
                return num;
        }

        Single(String s) {
                System.out.println(s+"对象被创建");
        }

        private static Single s = new Single("静态");
       
        public static void main(String[] args) {
                Single s1 = new Single("第一个");
                Single s2 = new Single("第二个");
                s1.setNum(30);
                System.out.println(s2.getNum());
        }
}

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1 赞一个!

查看全部评分

回复 使用道具 举报
是3个对象,因为private static Single s =new Single();静态是随着类的加载而加载的,只要调用了这个类,这个s就会一直存在于静态区,因为他存在于对象之前, 所以你新建多少对象,他都只执行一次,所以顺序是s,s1,s2。  
回复 使用道具 举报
以上的回答已经很清楚,是三个对象,顺序是s,s1,s2。且是放在方法区里的。但我看你的程序,认为你还是别的问题没有弄清楚。s是s1和s2对象中的元素。如下代码:
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();//静态成员
   
    public void setS(int i)
    {
            s.setNum(i);
    }
    public int getS()
    {
            return s.getNum();
    }
}
class SingleDemo
{
        public static void main (String[]args)
        {
                Single s1 = new Single();
        Single s2 = new Single();
        s1.setNum(30);//调用setNum()函数,不是s1元素s中的值,是s1自己的元素,并不是静态变量
        s1.setS(90);
        System.out.println(s2.getNum());//s2中的值没有setNum过,所有是默认的0。不是静态变量
        System.out.println(s2.getS());//s2中的s是静态变量,所以在这里可以输出他的结果
    }
}
输出结果:
0
90
回复 使用道具 举报
s是在方法区也可以叫做静态区;因为被static所修饰;所有就是随着类的加载而加载;一共new了三个对象;第一个对象是s 第二个是s1      第三个是s2;
回复 使用道具 举报
//一共有3个对象被创建

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的加载而加载的。当然是第一个被创建。但是这样创建的对象是很费内存的,因为他在整个的class执行过程中都存在。}
class SingleDemo
{
        public static void main (String[]args)
        {
        Single s1=new Single();//第二个被创建的对象
        Single s2=new Single();//第三个被创建的对象
        s1.setNum(30);//设置对象s1中的num值为你30
        System.out.println(s2.getNum());//输出s2的num值,结果为0;因为在创建对象成员初始化,成员变量初始值为0
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马