论坛首页 Java企业应用论坛

Java容易搞错的知识点-觉得基础扎实的来看

浏览 61880 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-03-07  
keke8614 写道
楼主学习JAVA多长时间了?

我搞java有好些年头了,基础的东西以前确实常握得不太扎实。你想说我太菜了,还是太烂了?如果不是最好。如果是的话,别太张狂,先看看自已有没有料,别人不一定比你差。
0 请登录后投票
   发表时间:2011-03-07  
neverforget 写道
System.out.println("a == x+y:" + (a == (x + y)));  

是true

如果你猜是true,那你是错的。如果你运行了代码,那只能说能你的编译器是自已开发的。
0 请登录后投票
   发表时间:2011-03-07  
liwenjie 写道
那么(a == (x + y))为什么是false呢?这点暂点有点不大清楚。初步认为是x+y是引用相加,不能放入常量池。

因为x+y不是编译是确定值而是运行时确定值

七:对象引用
java是按值传递,对象类型的话,分为栈上的引用和堆上的对象,栈上的引用被复制一份,如果操作堆上的对象则对象改变,但是如果操作引用则不改变

第七题你说得还是不够详细,愿听进一步分解。
0 请登录后投票
   发表时间:2011-03-07  
zofuthan 写道
第二道题,我觉得是这样的。a+b是字符串相加,我记得字符串相加是重新构建了个new StringBulider类的,所以是false
第七道题,你解释的不够清楚,我补充下。首先,Java的方法传递其实是值传递!基础数据大家都明白;主要是对象,对象它其实传递的是地址数值。所以,形参a,b是局部变量,在调用时,他们都指向main方法中的a,b局部变量,因为a.append(b)是对main方法中a变量地址的操纵,所以append方法调用后,a的值变化了,但是append方法中局部变量b它最后指向了main方法中a的地址,可是这个b和main中的b却不是一样的,main中的b所指向的地址中,值并未发生改变。所以syso的结果就是ab,b

第2.但前面也是字符串相加呀。我更相信有一个哥们说的:因为x+y不是编译时确定值而是运行时确定值。
第7.基本是这样说的,但期待有进一步深化的分析。
0 请登录后投票
   发表时间:2011-03-07  
本来以为基础还行的,汗啊
0 请登录后投票
   发表时间:2011-03-07  
System.out.println("a == x+y:" + (a == (x + y)));  
这个整错了
String x = "hello";  
String y = "world";
String a = "helloworld";
13行String b = "hello" + "world";
14行String c = x + y;
生成的字节码不一样:
L3
    LINENUMBER 13 L3
    LDC "helloworld"
    ASTORE 4
   L4
    LINENUMBER 14 L4
    NEW java/lang/StringBuilder
    DUP
    ALOAD 1
    INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
    INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
    ALOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
    ASTORE 5

13行 "hello" + "world";2个都是常量,编译器在编译器应该是可以确定的,直接 LDC "helloworld"
14行就是先new StringBuilder了
0 请登录后投票
   发表时间:2011-03-07  
还好 还好,最后一题需要琢磨一下
0 请登录后投票
   发表时间:2011-03-07  
做错了一题,最后一题......继续加强
0 请登录后投票
   发表时间:2011-03-07  
4.那么(a == (x + y))为什么是false呢?这点暂点有点不大清楚。初步认为是x+y是引用相加,不能放入常量池。
之前看过这个String的操作方式,如果不是两个String直接操作,而是通过X,Y这样的变量操作的话,那么会通过StringBuilder来进行String的操作。
最后一个的话,我觉得楼主回答的对的。我的理解方式是,java是值传递,且不可改变的。
0 请登录后投票
   发表时间:2011-03-07  
七、对象引用
方法参数的使用情况:
1.一个方法不能修改一个基本数据类型的参数(数值型和布尔型)
2.一个方法可以改变一个对象参数的状态
3.一个方法不能实现让对象参数引用一个新的对象
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics