JAVA的值传递

来源:互联网 发布:无线访客网络设置 编辑:程序博客网 时间:2024/06/06 01:03

这里讲讲JAVA中的值传递和所谓的引用传递还有两个特殊的String和null,因为当时在这里曾经被误导很多次,所以来分享下自己的想法惊讶


我们先来讲讲值传递吧,一般针对基本数据类型我们把他称之为值传递。
我们定义一个类A
class A{
public void show(int a){
//定义一个show方法,需要传入一个int型参数,这里为什么我没说传入a,其实这里很多人会被误导,方法里面的int a其实无关紧要,他可以叫b,叫c都可以,其实取叫为a就是误导你的。
a=3;
System.out.println("show中a = "+a);
}
public static void main(String[]args){
A Objecta = new A();
int a =2;//这里我们定义了一个整形a,并初始化赋值为2
Objecta.show(2);//把2传入
System.out.println("main中a="+a);//打印a值
}
}
上述结果会依次打印 show中a=3 main中a=2
这里a中的值并没有发生变化,这个是为什么呢。
因为他传的时候传的不是a,而是他的一个副本,你改变的是他副本的值,而这个副本的生命周期只存在于方法中,方法调用结束,他就被销毁了。




引用传递---->其实我也认同java没有引用传递这种说法,也就是说java只有值传递,为什么这么说呢?
因为java没有指针的说法却有他的概念,那就是地址,引用传递说明我们传的是引用是地址,地址也是常量,那就说明我们依然是值传递,只是传的是地址,也就是引用而已。

首先我们来看个图

图画的比较差,意思看下例就懂了
class B{
public void show(int arr1[]){
//这里形参arr1[]的名字可是可以随便取的
arr1[0]=17;
System.out.println("show中arr[0] = "+arr[0]);
}
public static void main(String[]args){
B Objectb = new B();
int arr1 =new int[]{14,15,16};//这里我们定义了一个整形数组arr1,并初始化赋值为2
Objecta.show(arr1);//把数组传入
System.out.println("main中arr1[0]="+arr1[0]);//打印a值
}
}
两个结果都会打印17,因为引用传递传递的是地址,如果绿色箭头引用把arr1[0]的值改了,由于绿色和蓝色是引用的是一个地方,对蓝色来说地址是不会,但是里面存放的东西变了,所以看出来的效果蓝色原arr1[0]已经被改变了

但是这里有两个特例:
一个是null类型,如果你传入的对象是一个null类型,什么意思呢,就是说我先创建一个对象赋值为Null,把这个对象传入方法,不管你在方法里面做什么操作,返回的都是null而且必报NullPointerException


第二个就是String类型了
这个我就不画图了

String不是引用类型吗,为什么效果和基本数据类型一样呢?
因为我们要记住,new的String的定义是这样子的他是定义后就不可更改的类型,内存分配空间就只有这么大。如果你对他进行拼接,拆取等操作,其实他是重新开辟了一个内存空间赋值而已,所以这里从侧面也看出了String拼接字符串相比StringBuilder或者StringBuffered占内存大。(PS:StringBuilder和StringBuffered是在原内存基础上加减,所以内存开销要小)也就是说这里其实是重新创建了String对象指向a(PS:用hashcode证明我感觉不妥当,差不多就是那个意思)

感觉写的不够详细,有的地方逻辑不严谨,望指正,共同学习


0 0
原创粉丝点击