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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑汉伟 中级黑马   /  2015-6-24 16:09  /  472 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

昨天刚通过基础班的电话面试,本以为是件很简单的事,没想到当老师问到我几个基础问题时,有的回答上来了,有的问题令我不禁语塞,使劲想也没想起来,然后厚着脸皮对老师说我一时紧张忘记了,请老师再换一个问题,结束后赶紧翻了翻笔记,真的觉得好丢人,while跟do while的区别我竟然也没回答上来,觉得真该好好复习一下,复习过程中没想到发现更多问题,有些都是以前理解了的,但是再看的时候又不懂了,真是气煞我也!!没办法,谁让我基础太差了呢,下面把我刚弄懂的一个问题跟大家分享一下,也是给我自己提个醒……

PS:我确实是个真正的菜鸟一枚,视频才看到面向对象,原来以为半个多月的时间能把视频看完,完成就业班的入学流程,但是自学实在是太困难了,各种因素导致完成可能性太低,所以我毅然决然的决定报基础班,也是为了把基础好好夯实一下吧,当然这是对于我辈菜鸟而言,相信对于某些大能来说真是小菜一碟,好了,闲话就说到这&&

正题:
我看过视频教程之后还会再看一遍阳哥笔记,以便记得更牢靠(好吧,我承认还是自己基础太差,我的自尊心……!),当我看到基本数据类型参数及引用数据类型参数传递的时候,阳哥笔记里有个实例:
示例1:基本数据类型参数传递
//基本数据类型参数传递
class Demo
{
        public static void main(String[] args){
                int x = 3;
                show(x);
                System.out.println("x=" + x);
        }

        public static void show(int x){
                x = 4;
        }
}
运行结果是: x=3;
一开始我还真没搞明白,看了执行过程说明之后觉得懂了点,即
    1、jvm调用main方法,main方法入栈。
    2、将x变量值设置为3。
    3、main方法调用show方法,3作为基本数据类型参数赋值给show方法参数x,也就是说,此时show方法的参数x值为3。
    4、show方法执行x=4后,show方法的参数x值变为4。
    5、show方法执行结束,show方法出栈。show方法参数x也随之出栈。
    6、main方法打印x的值。此时x指的是main方法中的x变量的值(show方法中的参数x已经随show方法一块出栈了)。所以,打印出来的x值为3而不是4。
    7、main方法执行结束,出栈。

这是从内存的角度来讲解整个流程,简单易懂,极具说服力,但是因为刚了解了成员变量和局部变量,按照我的理解就是 5行  int x=3;这是一个成员变量,定义在类中,存放于堆内存中,而 6行中的x是局部变量,定义在show函数的范围内,存放于栈内存中,函数结束,该变量就自动释放了,所以该结果是:x=3.
这是一个很简单的小问题,估计有的人都会觉得不屑一顾,但是谁让我是菜鸟呢,郁闷!!我只是觉得自己这样理解这个问题更舒服一些,呵呵,请各位大哥大姐们不要取笑小弟!!
实际上我就是想借这个小例子告诉跟我一样还在基础知识上努力挣扎的“黑”友们,基础确实太重要了,而打好基础的一个关键因素就是要好好的做好笔记,以便于好好的复习,上面的这个小问题就是我在复习的时候突然想到的,问题虽然简单,但收获不简单,古人曾曰:温故而知新,可以为师矣。我很喜欢这句话,故送给大家一句话,学而时习之,不亦乐乎。与大家共勉:lol


7 个回复

倒序浏览
确实,基础重要,做笔记,学而时习之更重要!
回复 使用道具 举报
一起努力  共同进步
回复 使用道具 举报
学习ing...................................
回复 使用道具 举报
问你一个问题哈,怎么就让他可以打印4了呢?
回复 使用道具 举报
帅帅loyal 发表于 2015-6-24 17:50
问你一个问题哈,怎么就让他可以打印4了呢?

晕!我上面好像写错了,5行 那个x应该是局部变量,只是赋值给了6行show函数里的x,然后函数运行,x变成4,然后函数结束释放出来,打印的还是主函数的x=3.
要让它打印x=4,应该这样写:
class Demo
{
        int x = 3;
        
        public static void main(String[] args){
                Demo d = new Demo();
                show(d);
                System.out.println(d.x);
        }
        
        public static void show(Demo d){
                d.x = 4;
        }
}
/*把 int x=3;写到函数外的类中(这样x应该是成员变量),在主函数中建立一个新的对象来调用show函数中的值,即在堆内存中建立新的对象,然后调用show方法,把堆内存中的实体对象的属性x值变成4*,当show方法执行完出栈,主函数d依然是指向在堆内存中建立的对象的属性x的值/
回复 使用道具 举报
这个问题我也在慢慢适应
回复 使用道具 举报
学习了 谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马