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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周志伟 黑马帝   /  2013-4-3 01:25  /  2460 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周志伟 于 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, 下载次数: 130)

7027fee3gbcb63e30eff8&690.jpeg

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

18 个回复

倒序浏览
new Car()表示在堆内存中产生了一个对象,但是并没有一个类变量指向它。
这个图你得按步骤看来看,这是第一步,仅仅产生对象,还没有将对象的引用交给别人。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
因为c是一个指针,指向的是这个new car()的对象的地址。这个是C++里面的指针问题。就像现在,new car()只是一个对象,你没法称呼它呢,所以用指针,指向它,但是在右边的时候,她只是一个new car()的对象。而且,下面一直可以创建新对象的。只要内存够大。打个比方,婴儿刚出生时,没有名字,都在婴儿房内,你没发叫这个婴儿名字,只能以婴儿代替。进婴儿房一个,不能说谁谁来了,只能是一个婴儿来了。当然,婴儿房床上帖的号码,就相当于c这个指向地址的指针。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
堆中存放的都是对象和数组,new Car();是一个对象,代表一个实体
如果写成Car c = new Car();就不是代表一个对象了,而是表示在堆中new了一个对象,并把这个对象的地址赋给了c变量,c就指向了new出来的这个对象,这是一个过程。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 朱德帅 于 2013-4-3 12:48 编辑

因为老师这是在描述new对象时,内存中的变化过程。首先new Car()会在堆内存中创建一个Car对象,里面包含了Car的一些属性和方法。其实,在堆内存里还有一块地方用来存储Car的字节码。new对象时是先找到这个字节码,通过这个字节码再在堆内存中创建对象的。当 Car c = new Car();时,这时候又会在栈内存中定义一个变量,用来指向堆内存对象的地址。这就是整个Car c = new Car();的过程。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
pthuakai 发表于 2013-4-3 09:06
因为c是一个指针,指向的是这个new car()的对象的地址。这个是C++里面的指针问题。就像现在,new car()只是 ...

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


根据我现在写的代码,我画的图对吗?
回复 使用道具 举报
pthuakai 发表于 2013-4-3 09:06
因为c是一个指针,指向的是这个new car()的对象的地址。这个是C++里面的指针问题。就像现在,new car()只是 ...


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

回复 使用道具 举报
吴林飞 发表于 2013-4-3 10:27
堆中存放的都是对象和数组,new Car();是一个对象,代表一个实体
如果写成Car c = new Car();就不是代表一 ...


根据我现在写的代码,我画的图对吗?
回复 使用道具 举报
朱德帅 发表于 2013-4-3 11:21
因为老师这是在描述new对象时,内存中的变化过程。首先new Car()会在堆内存中创建一个Car对象,里面包含了C ...


根据我现在写的代码,我画的图对吗?
回复 使用道具 举报
周志伟 发表于 2013-4-3 15:47
根据我现在写的代码,我画的图对吗?

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

什么都没有做?内存中怎么会有对象呢!你new对象才会在堆内存中开辟空间去存储对象
回复 使用道具 举报
朱德帅 发表于 2013-4-3 22:36
什么都没有做?内存中怎么会有对象呢!你new对象才会在堆内存中开辟空间去存储对象 ...

奥,明白了,谢谢。
回复 使用道具 举报
张权 发表于 2013-4-3 19:41
首先 new Car()这是一个匿名对象, 也就是没有名字的对象, 它会在堆内存空间常见一个对象, 但是么有引用指向 ...

明白了,谢谢啦
回复 使用道具 举报
周志伟 发表于 2013-4-3 15:46
根据我现在写的代码,我画的图对吗?

程序是从主函数开始的,主函数里面没有代码肯定不对。
回复 使用道具 举报
罗平 发表于 2013-4-4 18:34
程序是从主函数开始的,主函数里面没有代码肯定不对。

恩恩,知道了,谢谢哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马