黑马程序员技术交流社区

标题: 面向对象(类与对象的关系) [打印本页]

作者: 周志伟    时间: 2013-4-3 01:25
标题: 面向对象(类与对象的关系)
本帖最后由 周志伟 于 2013-4-4 00:07 编辑
  1. class Car
  2. {
  3. String color = "红色";

  4. int num = 4;
  5. void run()
  6. {
  7.   System.out.println(color+".."+num);
  8. }
  9. }
  10. class CarDemo
  11. {
  12. public static void main(String[] args)
  13. {
  14.   //生产汽车,在java中通过new操作符来完成。
  15.   //其实就是在堆内存产生一个实体。
  16.   Car c = new Car();//c就是一个类类型变量,记住:类类型变量指向对象。
  17.   //需求:将已有车的颜色改成蓝色,指挥该对象做事情,在java指挥方式是:对象.对象成员
  18.   
  19.   c.color = "blue";
  20.   c.run();
  21.   Car c1 = c;
  22.   c1.color="green";
  23.   c.run();
  24. }
  25. }

  26. <FONT color=red>疑问:这里毕老师为什么只写:new Car(); ,为什么不写成:Car c = new Car();?????????</FONT>
  27. <IMG border=0 alt="" src="http://bbs.itheima.com/forum.php?mod=image&aid=14962&size=300x300&key=d8b11a0a080b31231c484601ec18656c&nocache=yes&type=fixnone" aid="attachimg_14962">
复制代码

7027fee3gbcb63e30eff8&690.jpeg (52.84 KB, 下载次数: 126)

7027fee3gbcb63e30eff8&690.jpeg

作者: 罗平    时间: 2013-4-3 09:03
new Car()表示在堆内存中产生了一个对象,但是并没有一个类变量指向它。
这个图你得按步骤看来看,这是第一步,仅仅产生对象,还没有将对象的引用交给别人。
作者: pthuakai    时间: 2013-4-3 09:06
因为c是一个指针,指向的是这个new car()的对象的地址。这个是C++里面的指针问题。就像现在,new car()只是一个对象,你没法称呼它呢,所以用指针,指向它,但是在右边的时候,她只是一个new car()的对象。而且,下面一直可以创建新对象的。只要内存够大。打个比方,婴儿刚出生时,没有名字,都在婴儿房内,你没发叫这个婴儿名字,只能以婴儿代替。进婴儿房一个,不能说谁谁来了,只能是一个婴儿来了。当然,婴儿房床上帖的号码,就相当于c这个指向地址的指针。
作者: 吴林飞    时间: 2013-4-3 10:27
堆中存放的都是对象和数组,new Car();是一个对象,代表一个实体
如果写成Car c = new Car();就不是代表一个对象了,而是表示在堆中new了一个对象,并把这个对象的地址赋给了c变量,c就指向了new出来的这个对象,这是一个过程。

作者: 朱德帅    时间: 2013-4-3 11:21
本帖最后由 朱德帅 于 2013-4-3 12:48 编辑

因为老师这是在描述new对象时,内存中的变化过程。首先new Car()会在堆内存中创建一个Car对象,里面包含了Car的一些属性和方法。其实,在堆内存里还有一块地方用来存储Car的字节码。new对象时是先找到这个字节码,通过这个字节码再在堆内存中创建对象的。当 Car c = new Car();时,这时候又会在栈内存中定义一个变量,用来指向堆内存对象的地址。这就是整个Car c = new Car();的过程。
作者: 黄玉昆    时间: 2013-4-3 12:48
pthuakai 发表于 2013-4-3 09:06
因为c是一个指针,指向的是这个new car()的对象的地址。这个是C++里面的指针问题。就像现在,new car()只是 ...

在java中一般不叫指针,称之为引用,不过你的比喻比较有意思
作者: hg3093483    时间: 2013-4-3 13:13
匿名对象,可以直接调用
作者: 周志伟    时间: 2013-4-3 15:46
罗平 发表于 2013-4-3 09:03
new Car()表示在堆内存中产生了一个对象,但是并没有一个类变量指向它。
这个图你得按步骤看来看,这是第一 ...


根据我现在写的代码,我画的图对吗?

作者: 周志伟    时间: 2013-4-3 15:47
pthuakai 发表于 2013-4-3 09:06
因为c是一个指针,指向的是这个new car()的对象的地址。这个是C++里面的指针问题。就像现在,new car()只是 ...


根据我现在写的代码,我画的图对吗?


作者: 周志伟    时间: 2013-4-3 15:47
吴林飞 发表于 2013-4-3 10:27
堆中存放的都是对象和数组,new Car();是一个对象,代表一个实体
如果写成Car c = new Car();就不是代表一 ...


根据我现在写的代码,我画的图对吗?

作者: 周志伟    时间: 2013-4-3 15:48
朱德帅 发表于 2013-4-3 11:21
因为老师这是在描述new对象时,内存中的变化过程。首先new Car()会在堆内存中创建一个Car对象,里面包含了C ...


根据我现在写的代码,我画的图对吗?

作者: 吴林飞    时间: 2013-4-3 19:14
周志伟 发表于 2013-4-3 15:47
根据我现在写的代码,我画的图对吗?

没有new堆内存中是没有对象的,也就没有color = "red"; num = 4;
面向对象这部分最好是多看几遍视频,再找找这方面的书结合看,效果比较好。
作者: 张权    时间: 2013-4-3 19:41
首先 new Car()这是一个匿名对象, 也就是没有名字的对象, 它会在堆内存空间常见一个对象, 但是么有引用指向它. 不过因为它是一个对象, 那么它肯定就可以直接来使用它所具有的成员(num, run()方法,color).
然后再说你的那个图, 你没有new 对象, 那么根本就没有把Car类加载进内存, 那么你的堆内存有怎么可能有那些属性呢?
作者: 田磊阳    时间: 2013-4-3 22:17
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: 朱德帅    时间: 2013-4-3 22:36
周志伟 发表于 2013-4-3 15:48
根据我现在写的代码,我画的图对吗?

什么都没有做?内存中怎么会有对象呢!你new对象才会在堆内存中开辟空间去存储对象
作者: 周志伟    时间: 2013-4-4 00:05
朱德帅 发表于 2013-4-3 22:36
什么都没有做?内存中怎么会有对象呢!你new对象才会在堆内存中开辟空间去存储对象 ...

奥,明白了,谢谢。
作者: 周志伟    时间: 2013-4-4 00:07
张权 发表于 2013-4-3 19:41
首先 new Car()这是一个匿名对象, 也就是没有名字的对象, 它会在堆内存空间常见一个对象, 但是么有引用指向 ...

明白了,谢谢啦
作者: 罗平    时间: 2013-4-4 18:34
周志伟 发表于 2013-4-3 15:46
根据我现在写的代码,我画的图对吗?

程序是从主函数开始的,主函数里面没有代码肯定不对。
作者: 周志伟    时间: 2013-4-4 22:06
罗平 发表于 2013-4-4 18:34
程序是从主函数开始的,主函数里面没有代码肯定不对。

恩恩,知道了,谢谢哈




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