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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2013-1-24 14:37  /  6040 人查看  /  36 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2013-1-28 15:11 编辑

        黑马的发展可真快啊,感觉才毕业没多久,17届都有了,黑马真是强!!!
        好久没来论坛逛了,很多东西要学习的,现在感觉上班挺好的,没什么压力,上班时间还可以学习。我以前看的基础视频是张孝详老师的,后来才知道老毕的基础视频讲的比较牛,最近我也在看老毕的基础视频了,老毕真是神人也,讲课也太好了,要问到目前为止我觉得讲课最厉害的,当属老毕了,虽然他没有亲自教过我。看了老毕画的内存图,感觉很清析,后来我自己也画了个,贴出来给大家看看对不对。
        学弟学妹们为进黑马都很努力哈,以前听说老有人抱怨积分难赚,在这里我也给大家个赚积分的机会吧,在后面有两个练习,大家可以试着把内存图画出来,对你理解对象的赋值传参都肯定大有收益,只要你画出来了,我相信 版主肯定会给积分的。而且我这有许多金币,看谁画对的我给他奖励些金币,不只道系统允许给多少。现在这东西好似可以在积分商城买东西了。

下面是我画的内存分析图:
class Person { }
class QuoteDemo {
   public static void newPerson(Person p) {
      p = new Person();
   }
   public static void main(String[] args) {
      Person p = null;
      newPerson(p);
      System.out.println(p);// 此处打印:null
   }  
}
代码从main方法开始执行:
1Person p = null; 执行后的内存图:

2newPerson(p); 调用newPerson方法时在栈内存又生成了一个newPerson方法中的变量p

3newPerson(p); 这里把main方法中的p的值传给了newPerson方法中的p,所以此时newPerson方法中的p也指向了null

4p = new Person();执行newPerson 方法中的代码后内存图:
5newPerson方法执行完后继续执行main方法中的代码:System.out.println(p); 这里打印的pmain方法中的p,所以打印结果为:null


听说字符串也算是对象,也是在堆内存中分配的,看下面例子:
  1. import java.util.ArrayList;

  2. public class Demo {
  3.         public static void main(String[] args) {
  4.                 ArrayList<String> al = fun();
  5.                 String s = al.get(0);
  6.                 System.out.println(s);
  7.         }
  8.         
  9.         public static ArrayList<String> fun(){
  10.                 ArrayList<String> al = new ArrayList<String>();
  11.                 String s = "张三" ;
  12.                 al.add(s);
  13.                 s = "李四";
  14.                 return al;
  15.         }
  16. }
复制代码
运行后,打印结果是:  张三

再看下面例子:
  1. class Person {
  2.         String name;
  3. }

  4. class QuoteDemo {
  5.         public static void newPerson(Person p) {
  6.                 p = new Person();
  7.         }
  8.         public static void main(String[] args) {
  9.                 ArrayList<Person> al = fun();
  10.                 Person p = al.get(0);
  11.                 System.out.println(p.name);
  12.         }        
  13.         
  14.         public static ArrayList<Person> fun(){
  15.                 ArrayList<Person> al = new ArrayList<Person>();
  16.                 Person p = new Person();
  17.                 p.name = "张三";
  18.                 al.add(p);
  19.                 p.name = "李四";
  20.                 return al;
  21.         }
  22. }
复制代码
运行后,打印结果是:  李四


点评

有时间了 常来逛逛啊 嘿嘿  发表于 2013-1-24 19:26

评分

参与人数 2黑马币 +39 收起 理由
黄锦成 + 9 过来支持。金币不多,意思意思下.
金鑫 + 30 顶学长

查看全部评分

36 个回复

倒序浏览
支持学长来了
回复 使用道具 举报
{:soso_e105:}我要去....顶学长....
回复 使用道具 举报
希望学长以后能有时间多回来转转,给学习学妹们多多传授经验
回复 使用道具 举报
金鑫 发表于 2013-1-24 14:53
希望学长以后能有时间多回来转转,给学习学妹们多多传授经验

还没奖给别人金币呢,我就赚了几十金币了:lol
金鑫你不是我们班的吗?我记得我们九期好像有一个同学叫金鑫~~~
回复 使用道具 举报
不晓得准不准确,望指点
第一题,输出  “张三”   画的不好看,额



捕获.PNG (24.72 KB, 下载次数: 80)

捕获.PNG

点评

fun()中的al不要指向main中的al,应该是main中的al指向堆内存中的0x0001  发表于 2013-1-24 23:16

评分

参与人数 2技术分 +1 黑马币 +60 收起 理由
戴振良 + 60 很给力!
黄锦成 + 1 加油

查看全部评分

回复 使用道具 举报

1.ArrayList<String> al = fun();//调用的方法返回一个引用地址,类型是一个集合。此条没有开避内存空间
//执行方法fun
2.ArrayList<String> al = new ArrayList<String>();//开避一个空间a1,用作集合存放   只收 <String>  假定地址:0111
3.String s = "张三" ;                al.add(s);
                s = "李四";

//s指向堆中的“张三”(如果没有张三,就new张三再指向)。
//空间a1加入元素“张三”
//s重指向堆中“李四”(如果没有李四,就new李四再指向)。
4.return al;//返回引用,即将地址:0111,给赋 main中的a1.

5.
String s = al.get(0);
                System.out.println(s);

//获取集合中第一个元素,打印到控制台。

1.png (12.72 KB, 下载次数: 63)

1.png

1.png (12.72 KB, 下载次数: 68)

1.png

评分

参与人数 2黑马币 +69 收起 理由
戴振良 + 60 很给力!
黄锦成 + 9

查看全部评分

回复 使用道具 举报
学长 以后要常来啊  加油  

看看 我画的 怎样?

1.png (53.44 KB, 下载次数: 70)

1.png

2.png (73.07 KB, 下载次数: 75)

2.png

评分

参与人数 2黑马币 +69 收起 理由
戴振良 + 60 很给力!
黄锦成 + 9 第一个图画得可以,最好要分清两个方法中的.

查看全部评分

回复 使用道具 举报
李培根 来自手机 金牌黑马 2013-1-24 18:22:01
9#
学长的金币可以去换个u盘下做纪念了。

点评

我已经有移动硬盘、U盘、内存卡多张了,还是把这机会留给大家吧!  发表于 2013-1-25 10:51
回复 使用道具 举报
{:soso_e113:}学长第一个内存分析图的例子也有一定迷惑性的,估计应该有人第一时间怀疑怎么会是null的吧
回复 使用道具 举报
我也来做一下,师兄,指导一下啊

test1.PNG (19.48 KB, 下载次数: 78)

这是第一题的

这是第一题的

test2.PNG (20.26 KB, 下载次数: 76)

这是第二题的

这是第二题的

评分

参与人数 1黑马币 +60 收起 理由
戴振良 + 60 很给力!

查看全部评分

回复 使用道具 举报
话说,我怎么就不会看图呢~{:soso_e101:}

点评

还没看老毕视频吧!  发表于 2013-1-25 10:57
回复 使用道具 举报
疑惑的是不知道 第二个 person 类中的 name属性在堆中有没有单独的一块空间?

复件 内存图1.jpg (1.03 MB, 下载次数: 84)

复件 内存图1.jpg

内存图2.jpg (1.03 MB, 下载次数: 70)

内存图2.jpg

评分

参与人数 2技术分 +1 黑马币 +60 收起 理由
戴振良 + 60 赞一个!
黄锦成 + 1

查看全部评分

回复 使用道具 举报
txl 中级黑马 2013-1-24 20:40:29
14#
本帖最后由 黑马唐贤来 于 2013-1-24 20:44 编辑

第一张弄出来啦
{:soso_e134:}

QQ截图20130124204325.png (62.86 KB, 下载次数: 64)

QQ截图20130124204325.png

评分

参与人数 2技术分 +1 黑马币 +30 收起 理由
戴振良 + 30 赞一个!
黄锦成 + 1 不错。可以完善一下,例如s指向了李四,指.

查看全部评分

回复 使用道具 举报
梁俊 黑马帝 2013-1-24 20:59:22
15#
都是高手啊
回复 使用道具 举报
学长发帖 必须支持下。话说回来了 老毕的基础视频真不是盖的。相当好,基础的标杆啊。
回复 使用道具 举报
顶学长,向学长学习!{:soso_e129:}
回复 使用道具 举报
周志强 发表于 2013-1-24 17:39
学长 以后要常来啊  加油  

看看 我画的 怎样?

点评有个数限制,直接回复了:第一个图画得可以,最好要分清两个方法中的al,第二个图中,Person在内存中只有一个对象,你弄成了两个了
回复 使用道具 举报
王少雷 发表于 2013-1-24 19:30
话说,我怎么就不会看图呢~

这个要多看毕老师画内存图的视频,分清楚值类型和引用类型在内存中的情况
回复 使用道具 举报
本帖最后由 黄锦成 于 2013-1-24 23:31 编辑
黑马唐贤来 发表于 2013-1-24 20:40
第一张弄出来啦


不错。可以完善一下,例如s指向了李四,指向张三的线可以加个叉。
建议你继续把第二张图画出来
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马