String类型的2个参数变量之间传递的是地址还是值?java的参数都是值传递的。但行参存的是值么?如: class A{
String s="hello";
int n=0;
public A(){
}
public A(String str){
this(str,10);
}
public A(String str1,int i){
s=str1;
n=i;
}
public static void main(String[] args){
A t = new A("ok");
t.s==s //此处相等么
}
}
String s="hello";
int n=0;
public A(){
}
public A(String str){
this(str,10);
}
public A(String str1,int i){
s=str1;
n=i;
}
public static void main(String[] args){
A t = new A("ok");
t.s==s //此处相等么
}
}
在Java 中分两种数据类型:基本和引用。
String 是引用类型,它里面存放的是内容地址,地址指向它所代表的对象。而String 的对象不是Java的数据类类型,引用才是!
你上面的那个例子改变的是引用所指向对象的值,没有改变引用的值没有改变。
其实你这个例子正好证明Java到底是传值还是传值--因为对象的引用没有改变!
肯定是相等的,因为它们拥有指向同一个内存的指针
除了基本类型(整形,字符,boolean),传递的都是对象的地址的值。
2.String类型对象不可以改变。调用构造器时改变的只是一个副本,所以改变不了s。
3.可以在相应构造器中添加System.out.println(s);看看副本的作用范围.
值传递,应该是相等的
String s="hello";
int n=0;
public A(){
}
public A(String str){
this(str,10);
}
public A(String str1,int i){
s=str1;
n=i;
}
public static void main(String[] args){
A t = new A("ok");
t.s==s //此处相等么 //比较不了,这个s是哪里的?非静态成员属性依赖与对象存在,所以报错,不过String是对象,所以传参数是传地址。
}
}
t.s==s才有能比,不能从静态上下文引用非静态变量。是传了值还是传了引,建议阅读http://zangweiren.javaeye.com/blog/214369
public class CallByValueRef {
static String s="asd";
public static void modify(String s1){
s1="sfdsh";
System.out.println("s1 is "+s1);
}
public static void main(String[] args){
modify(s);
System.out.println(s);
}
}
在modify方法中改变的s1副本,对s无影响。
先在脑中想一下,我们在内存中三个地方,分别为:栈,堆,静态数据区
栈中有:t<引用>
堆中有:一个对象t,它里面有:s,n
静态数据区:s<为了区分开,这里我叫它ss>
这里面的ss其实就是指向堆内存中的 s.