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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

朱玉玺 发表于 2013-2-7 20:29
我知道,name为null是吧,这是因为Student的name隐藏了Person的name,而你在Student的name你调用的时候, ...

如果Person[] person = new Student[10]是对的,那么你打算给person[0]装什么东西呢?如果Person还有别的子类,比如Killer,那person[0]能指向Killer对象吗?
如果Person[] person = new Student[10],person[0]还是只能指向Student类型的话,那么别人不知道,会把Killer对象赋给person[0],那就错了。
如果person[0]能指向所有Person类型的子类型的话,那直接Person[] person = new Person[10]。
Person[] person = new Person[10],Person[0] = new Student(),是多态,用父类的数组元素指向子类的对象,Person[] person = new Student[10]这种东西有任何意义吗?把它声明成Person[]就是为了让别人知道,它的元素是指向Person类型及其子类型的,左边是Person[],右边是Student[10],这是为了干嘛?
回复 使用道具 举报
黄玉昆 发表于 2013-2-7 20:53
我不太同意你的观点,
对于你说的数组是对象,生存在堆上,我同意,但是数组只是对象的集合,是将相同类 ...

哥们,你好像没区分什么是对象,什么是对象的引用,引用有的翻译成句柄。
你的p是引用而不是对象,如果用指针来解释的话,把引用看成指针,对象是指针指向的那一坨东西。你可能认为p.XXX能调用到对象的成员,所以它是对象,可是它还是引用,正因为他是个遥控器,用“.”就相当于按下了遥控器上的按钮,然后对象就被遥控器操作了。这不是我的观点,书上都这么写的。new Student[10],是建立了十个引用,对象没有建。你如果还不信,那我也没办法了。
Student对象只能这样建:new Student();要想一次建很多Student,只能用循环一个一个建。
回复 使用道具 举报
王昕 发表于 2013-2-7 21:53
如果Person[] person = new Student[10]是对的,那么你打算给person[0]装什么东西呢?如果Person还有别的 ...

你说的确实对。但没意义归没意义,你不能说它错啊:lol
回复 使用道具 举报
黄玉昆 发表于 2013-2-7 21:35
他说的是对象的值(是值)不会是null,对象在默认初始化的时候,就是null,而引用怎么会是值呢?(我不是 ...

对象是一大坨东西,不是一个值,无从谈起是不是null,只有引用(reference)才能是null。
回复 使用道具 举报
黄玉昆 发表于 2013-2-7 21:37
数组与对象的内存分配方式相同。都是引用在栈,数据在堆。

哥们,你基本概念有误区。
引用可以在栈也可以在堆,像Student[] stu = new Student[10]这种吧,stu在栈,stu[1],stu[2]这种都在堆。new Student[10]就是十个引用绑在一起作为一个对象。new一下只能建一个对象,这个语句new出来的对象占的内存的大小是十个引用的大小,所有引用占的字节都是一样多的。而new Student();建的才是一个学生对象,学生对象有多大,那可就没准了。
回复 使用道具 举报
朱玉玺 发表于 2013-2-7 22:09
你说的确实对。但没意义归没意义,你不能说它错啊

我都不说编译运行有没有错的问题,那其实是不严重的问题。大家一起写程序,你写个Person[] p=new Student[10],我和你合作,我一看p是个Person[]类型,我往里装它的子类,比如Killer,会发生什么?
而且这个运行确实没有有意义的结果。这种建数组对象,左边是什么右边肯定也是什么的,因为右边本来就是为左边服务的。:handshake
回复 使用道具 举报
王昕 发表于 2013-2-7 22:12
对象是一大坨东西,不是一个值,无从谈起是不是null,只有引用(reference)才能是null。 ...

这“一大坨东西”是什么意思啊?怎么会不关null的事呢?
回复 使用道具 举报
王昕 发表于 2013-2-7 22:19
哥们,你基本概念有误区。
引用可以在栈也可以在堆,像Student[] stu = new Student[10]这种吧,stu在栈 ...

不知道给你写的那个代码,你运行了没有,你运行之后就知道,我就用了一个new,但是打印了十个null
  1. class Demo0
  2. {
  3.     public static void main(String[] args)
  4.    {
  5.        Person[] p = new Person[10];
  6.        for (int i=0;i<p.length;i++)
  7.        {
  8.            System.out.println(p[i]);        
  9.        }
  10.   }
  11. }
  12. class Person
  13. {
  14.      String name;
  15.      Person(String name)
  16.     {
  17.      this.name = name;
  18.     }
  19. }
复制代码
回复 使用道具 举报
黄玉昆 发表于 2013-2-7 22:25
这“一大坨东西”是什么意思啊?怎么会不关null的事呢?


就是说一个Student对象有什么,得看你写类的时候给他了多少成员变量,才能知道这坨东西有什么,有多大。
而引用,就占那么多字节 ,就是个遥控器。遥控器啥也不遥控的时候就是null,有东西遥控就是那个东西的地址。null是什么?null就是一个引用的特殊值,就是没有。对象只能说对象的某个成员变量是不是null,前提是这个变量是个引用类型。
回复 使用道具 举报
王昕 发表于 2013-2-7 22:24
我都不说编译运行有没有错的问题,那其实是不严重的问题。大家一起写程序,你写个Person[] p=new Student ...

呵呵,也只有在楼主这样的实验中,一般不会出现这种情况。
回复 使用道具 举报
王昕 发表于 2013-2-7 22:24
我都不说编译运行有没有错的问题,那其实是不严重的问题。大家一起写程序,你写个Person[] p=new Student ...

我不是为了说明这段代码是不是有意义,只是为了把内存分配问题搞清楚。只有内存中的状态清楚了,才能更好地理解代码,更好地运行代码。尤其在数组这种特殊的对象,还有一种类型就是String,也是很特殊的,我觉得能把这两个弄清楚,就基本上把类型性的知识学透彻了。这是我的本意。
回复 使用道具 举报
黄玉昆 发表于 2013-2-7 22:28
不知道给你写的那个代码,你运行了没有,你运行之后就知道,我就用了一个new,但是打印了十个null ...

我知道你一个new打印十个null啊,因为你new出来了十个绑在一起的引用啊。
十个绑在一起的引用是一个数组对象。
回复 使用道具 举报
王昕 发表于 2013-2-7 22:05
哥们,你好像没区分什么是对象,什么是对象的引用,引用有的翻译成句柄。
你的p是引用而不是对象,如果用 ...

我不是不信,既然都说服不了对方,那么就用很有权威性的证据说明一下,就行了。等我看到了相关的知识再交流。不过很谢谢你的回复。从你的回复中,确实学到了不少东西,十分感谢你
回复 使用道具 举报
本帖最后由 王昕 于 2013-2-7 22:39 编辑
朱玉玺 发表于 2013-2-7 22:31
呵呵,也只有在楼主这样的实验中,一般不会出现这种情况。


你没用person[1]. 这种来调用对象,我认为这样用的话是会出异常的。你用的都是student[1]. 。
回复 使用道具 举报
王昕 发表于 2013-2-7 22:37
你没用person[1]. 这种来调用对象,我认为这样用的话是会出异常的。你用的都是student[1]. 。 ...

用person的话,只能调name,不能掉id,因为这个引用看不到子类的id
回复 使用道具 举报
黄玉昆 发表于 2013-2-7 22:37
我不是不信,既然都说服不了对方,那么就用很有权威性的证据说明一下,就行了。等我看到了相关的知识再交 ...

嗯,畅销书还是比较权威的吧……你看看Head first Java第三章还是第四章记不清了,就知道了,还有后面多态的大概七八九章吧。
不用客气,你回复我认真,我自然回复你也认真,如果你表现的对我的说法不屑,我肯定也就不理啦:lol
你回我那么多是想帮我纠正我的错误,是想帮助我,虽然关于引用这个问题我比较有把握是我对了,不过以后别的问题就另当别论了。多交流总是好的,交流无所谓谁对谁错,一起学习,交流只要真诚就好,你的回复我觉得很真诚,所以我也想帮你搞清楚。引用是个遥控器这个比喻,很多书都用,包括Thinking in Java。
回复 使用道具 举报
朱玉玺 发表于 2013-2-7 22:40
用person的话,只能调name,不能掉id,因为这个引用看不到子类的id

有Person[] person = new Student[2];这种语句存在,并且有person[0] = new 随便();这种存在,用person[0].能输出正确的信息?
回复 使用道具 举报
只能new Student
回复 使用道具 举报
王昕 发表于 2013-2-7 21:53
如果Person[] person = new Student[10]是对的,那么你打算给person[0]装什么东西呢?如果Person还有别的 ...

你可以看看我新改的代码。结果会返回一个错误,是空指针异常,但是这个错我,我看了相关的文章,说是“空指针异常发生在对象为空,但是引用这个对象的方法。”。这说明,还是有对象存在的,只不过为空。
代码如下:
  1. class Demo0
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Student[] s = new Student[10];
  6.                 for (int i=0;i<s.length;i++)
  7.                 {
  8.                         s[i].name = (String)("a " + i);
  9.                         s[i].setId(i);
  10.                         System.out.println(s[i].name + "的ID:" + s[i].getId());       
  11.                 }
  12.         }
  13. }

  14. class Student
  15. {
  16.         String name;
  17.         private int id;
  18.         Student(String name,int id)
  19.         {
  20.                 this.name = name;
  21.                 this.id = id;
  22.         }
  23.         public int getId()
  24.         {
  25.                 return id;
  26.         }
  27.         public void setId(int id)
  28.         {
  29.                 this.id = id;
  30.         }

  31. }
复制代码
回复 使用道具 举报
王昕 发表于 2013-2-7 22:47
嗯,畅销书还是比较权威的吧……你看看Head first Java第三章还是第四章记不清了,就知道了,还有后面多 ...

嗯啊,你说的挺对的,不过你也可以看看java核心技术,里面关于对象中继承那部分,有关多态的知识。资料我分享在了帖子里,希望能对你有帮助。
资料:http://bbs.itheima.com/thread-37948-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马