在正文开始之前,我们先讲讲一个有趣的现象。
public static void main(String[] args) {
int a = 256;
byte b = (byte) a;
System.out.println("a="+a);
System.out.println("b="+b);
}
以上这段代码输出结果是a = 256;b = 0;这是为什么呢?原来byte的存储字节只有8 bit,而int有32 bit,这就导致byte b装不下int a,可是你又让机器强行转型装下。那么机器就只好按下面的方法变通一下了。
比如说int 256,机器就转为二进制000.....100000000,存储,那么强制用byte存储,机器就自动只存储后8位,抛弃掉了前面的位数,于是就只存储了00000000,当然b转为10进制就只有0了。
好了,讲完这个故事,我们就开始了正题——Java的参数传递。参数传递想必大家都不陌生,也都使用过,对于构造方法传参和set方法传参也都知道是怎么回事,那么大家知道我们传参传过去的是什么吗?究竟是一个地址还是确切的值呢?
二者的区别还是蛮大的。如果传的是值,那么在其他地方这个值发生了改变,它本身就不会有任何变化。而如果传的是地址,那么在其他地方发生 了改变,那么这个值就随之变了。
.......................................看图..................................A存的是地址,a是值
举个例子:我们在绘制画图板时,Graphics g传来传去,到处画东西,窗口都发生了变化,说明我们在传Graphics时,传递的是地址。
那么哪些参数是传的数值,哪些又是传的地址呢?
很简单,我们都知道Java的数据类型有,基本类型和引用类型两种。其中基本类型传参使传的是数值,引用类型。其中所有的基本类型传递的都是确切的值,比如说int ,short ,byte, char 等等,而引用类型(除String外)传递的则是地址。之所以除String外呢,是因为String传递的是值。为什么?查看String的源码,发现String的实现靠的其实还是基本类型char,这就能理解为什么String传递的是值了。
这样我们就能理解为什么用“==”比较字符串时偶尔会被坑了。
最后的最后,依然是欢迎不可能来看文章的大佬来拍砖。在下微信号1395349613.