java中的基本类型传值和类类型传值

JAVA的参数传递
Java中对于对象类型的参数和基本类型的参数,Java虚拟机JVM采用了不同的处理方式;
对于基本参数类型,采用的传值策略是将参数的值复制一份再传给方法,方法可以改变参数的复件,但是不会影响参数的原件;
对于对象类型,是将“参数的引用”复制一份再传给方法,在方法中可以把复件指向另一个对象,方法外原件指向还是原来的对象;但是在方法中修改引用对象的内容,原件指向的对象也会更改,因为它们指向的是同一个对象;

package test;

public class PassParamter {
public void methodA(StringBuffer str)
{
str.append("efg");
}

public void methodA(String str)
{
str.replace('a', '*');
}

public void methodB(String str)
{
str="hello";
}

public void methodC(char c)
{
c='*';
}

public void methodD(char[] a)
{
a[0]='*';
}

public static void main(String[] argv)
{
PassParamter test=new PassParamter();

StringBuffer strbuffer=new StringBuffer("abcd");
System.out.println("调用methodA方法之前,strbuffer:"+strbuffer);
test.methodA(strbuffer);
System.out.println("调用methodA方法之后,strbuffer:"+strbuffer);

String str="abcde";
System.out.println("调用methodA方法之前,str:"+str);
test.methodA(str);
System.out.println("调用methodA方法之后,str:"+str);
System.out.println("调用methodB方法之前,str:"+str);
test.methodB(str);
System.out.println("调用methodB方法之后,str:"+str);

char ch='a';
System.out.println("调用methodC方法之前,字符ch:"+ch);
test.methodC(ch);
System.out.println("调用methodC方法之后,字符ch:"+ch);

char c[]={'a','b'};
System.out.println("调用methodD方法之前,数组c[0]:"+c[0]);
test.methodD(c);
System.out.println("调用methodD方法之后,数组c[0]:"+c[0]);
}
}


结果如下:

调用methodA方法之前,strbuffer:abcd
调用methodA方法之后,strbuffer:abcdefg
调用methodA方法之前,str:abcde
调用methodA方法之后,str:abcde
调用methodB方法之前,str:abcde
调用methodB方法之后,str:abcde
调用methodC方法之前,字符ch:a
调用methodC方法之后,字符ch:a
调用methodD方法之前,数组c[0]:a
调用methodD方法之后,数组c[0]:*


String类比较特殊,它在内部是把字符串以常量数组存储的,即用了final修饰符,是不可变的;

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];


而replace方式是重新定义了一个String对象,所以对方法外的原件无影响;

public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
int len = value.length;
int i = -1;
char[] val = value; /* avoid getfield opcode */

while (++i < len) {
if (val[i] == oldChar) {
break;
}
}
if (i < len) {
char buf[] = new char[len];
for (int j = 0; j < i; j++) {
buf[j] = val[j];
}
while (i < len) {
char c = val[i];
buf[i] = (c == oldChar) ? newChar : c;
i++;
}
return new String(buf, true);
}
}
return this;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值