Posted on 2011-03-13 23:38
leekiang 阅读(293)
评论(0) 编辑 收藏 所属分类:
java
1,
double d = 1 / 4;System.out.println(d);//输出为0
2, public static void main(String[] args) {
StringBuffer a = new StringBuffer("a");
StringBuffer b = new StringBuffer("b");
append(a, b);
System.out.println(a.toString() + "," + b.toString());//输出为"ab,a"
}
public static void append(StringBuffer a, StringBuffer b) {
a.append(b);
b = a;
}
解释:由于java方法传值是值传递,所以方法里面的a,b虽然和方法外的a,b指向的对象一样,但是这两个引用在栈中的位置不一样。
过程大概是首先在栈中复制引用a为a',b为b',并令a'指向a所指的在堆中的StringBuffer对象,b'指向b所指的在堆中的StringBuffer对象。
因此方法中的b=a只是起到了b'=a'的作用,并没有影响方法外b的指向。
其实public static void append(StringBuffer a, StringBuffer
b)中的变量a,b只是main方法中的变量a,b的引用地址副本,也就是说相当于append中的a与main中的a是指向同一个地址,append中
的b与main中的b是指向同一个地址,所以a.append(b)操作影响到了main方法中的a,但是append方法中的b=a;操作只是改变了
append方法的中b的指向,并没有改变main方法中b的指向。
java是按值传递,对象类型的话,分为栈上的引用和堆上的对象,栈上的引用被复制一份,如果操作堆上的对象则对象改变,但是如果操作引用则不改变
java方法的参数传递有两种规则:(1)按值传递(by value) ,八种基本数据类型和String
(2)按址传递(by address)
,除String以外的所有复合数据类型,包括数组、类和接口
3,如果使用switch,那么每一个case和default里都要加break
Java容易搞错的知识点