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

© 高鑫 中级黑马   /  2012-4-28 19:40  /  3179 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Car
{        int num=4;
        String color="blue";
        void run()
        {System.out.println(num+".."+color);};
}
class Demo
{         public static void main(String[]args)
        {
                new Car();
        }
}[/code]

请问这个代码中的new Car()的初始化值是null吗?

第二个
  1. class Car
  2. {        int num=4;
  3.         String color="blue";
  4.         void run()
  5.         {System.out.println(num+".."+color);};
  6. }
  7.         class Demo
  8. {         public static void main(String[]args)
  9.         {
  10.                 show(new Car());   //Car在堆内存中创建,请问这个时候,Car的初始化值是null吗?
  11.         }
  12.         public static void show(Car c)
  13.         {
  14.                 c.num=3;
  15.                 c.color="black";
  16.                 c.run();

  17.         }
  18.        
  19. }
复制代码
以上2段代码中 new Car();的初始化值一样吗?初始化值不是应该是null的吗?为什么不是?

8 个回复

倒序浏览
本帖最后由 光sail 于 2012-4-28 20:27 编辑

1.newCar()表示Car对象在内存中new出了一个对象地址,但这个对象存在两个变量 int num=4,color="blue",
2. show(new Car())表示调用show方法,传入Car对象,并对Car对象两个变量赋值 num=3; c.color="black";

回复 使用道具 举报
其实你两段代码所要问的意思是一样的!你问的主要是new一个对象时,这个对象默认的num和color的值是多少?

你在new一个对象的时候,在堆内存中已经开辟了一个空间,此时num的值是你上面定义的4,color值是blue,如果

你不重新给新创建的new对象赋值的话,默认打印出的就是num=4;color="blue"。

代码示例:

class Car
{        int num=4;
        String color="blue";
        void run()
        {System.out.println(num+".."+color);};
}
class Test13
{         public static void main(String[]args)
        {
                //new Car();
                                Car  c= new Car();
                                //c.color="black";
                                System.out.println(c.num+"   "+c.color);
        }
}

运行结果:

4   blue

回复 使用道具 举报
new出来的对象再堆内存中就有地址,楼上的人说的也有点不合算,要是Car c;这样定义的话,类的对象就是null,只是在stack中有Car类型的一个引用变量,只是它不指向堆内存中的任何空间而已,只是Car类型对象的一种声明,可以用System.out.println(c);来看一下c的值,当没有new对象时,c的值为空,当c = new Car(),以后c的值就不为空了,它就指向内存中的一块地址了,楼主用的是匿名对象,但是它也是有地址的,所以也不为空。
回复 使用道具 举报
两段代码初始化的值是一样的都不是为null而是num为4、color为blue,因为在声明Car的时候就已经为num和color赋值了,但在第二段代码中是直接建立一show方法更改了car的值
回复 使用道具 举报
两个Car类对象中特有属性的初始化是一样的。
new Car();建立了对象就指向了一个地址值,所以new Car()不可能为null,而且两个new Car()的地址值也不是一样的,Car c=new Car();Car对象c的初始化是null,然后new Car();开辟空间分配地址值,将地址值指向了Car对象c。
Car类中的特有属性int类型num,String类型color,在创建对象后,在盏内存中对特有属性初始化,int类型num的初始化值为0,String类型的初始化值为null。然后再指向值。
回复 使用道具 举报
魏征 中级黑马 2012-4-28 21:04:03
7#
两个Car类对象中特有属性的初始化是一样的。
new Car();建立了对象就指向了一个地址值,所以new Car()不可能为null,而且两个new Car()的地址值也不是一样的,Car c=new Car();Car对象c的初始化是null,然后new Car();开辟空间分配地址值,将地址值指向了Car对象c。
Car类中的特有属性int类型num,String类型color,在创建对象后,在盏内存中对特有属性初始化,int类型num的初始化值为0,String类型的初始化值为null。然后再指向值。
回复 使用道具 举报
本帖最后由 根号5 于 2012-4-28 21:26 编辑

我认为楼主问的这两个问题其实是一个问题,当new一个对象的时候就对应的在堆内存空间中开辟了一个内存空间,这时如果设定一个对象的引用变量指向他,Car c = new Car(),(作为一个类来讲无所谓有没有初始值,赞同楼上的观点)c  也就指向了这个对象的地址。不用管打印"c"还是“new Car”得到的都是这个对象的地址(前提是不重写 toString()方法):代码如下
class Car
{        int num=4;
        String color="blue";
        void run()
        {System.out.println(num+".."+color);};
        /*public String toString()
                {
                        return "hello heima";
                }*/

}
class Demo
{         public static void main(String[]args)

        {
                        System.out.println( new Car());
        }
}
打印结果为 Car@1a80a69

如果把上边的toString()方法的注释去掉,打印的就是 hello heima

初始值什么的 关于值的都是针对变量或常量(总之都是关于量的)而言的,此时如果仅仅在Demo中定义一个Car类型的引用:也就是Car car;这样的car是一个引用变量,不指向任何对象,此时值为null。


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马