是的,还在学习Java的基础知识!所以我所指的文字说 - 引用类型(除了基元之外)都是通过引用复制的。现在,我也被告知字符串是引用类型 - 这就是为什么 -
String str = "test";
String another_str = "test";
if ( str != another_str )
{
System.out.println("Two strings are different"); // this is printed
}
如果是这种情况,为什么会发生这种情况 -
package prj_explore_infa_sdk;
public class parent_class {
public String test;
public parent_class (String str){
test = str;
test = "overriden";
}
public parent_class (){
test = "overriden";
}
}
package prj_explore_infa_sdk;
public class child_class extends parent_class{
public static void main(String[] args){
child_class cls = new child_class();
if ( cls instanceof parent_class)
System.out.println("Subclass is an instanceof parent class");
String start = "nice";
parent_class pclass = new parent_class(start);
start = "changed";
System.out.println("Start : " + start + ", pclass.test : " + pclass.test);
}
}
打印 -
Subclass is an instanceof parent class
Start : changed, pclass.test : overriden
如果复制了String引用,为什么不改变pclass对象的成员测试?
答案 0 :(得分:2)
在Java中,一切都按值传递。
对于引用类型,传递的值恰好是对象引用。
您遇到的问题是
start = "changed"
为您的方法的start
变量分配新 String
对象引用,而pclass
仍然具有旧 {{1对象引用。
顺便说一句,String
个对象是不可变的,无法修改。
答案 1 :(得分:0)
为什么要这样?
'开始'是一个引用,它引用了一个新的字符串对象'已更改'。你是不是以正确的方式理解参考。引用是指针。
答案 2 :(得分:0)
在parent_class的代码中,第一个测试指向null
。当你打电话
parent_class pclass = new parent_class(start); the control from this line went to:
public parent_class (String str){
上面的行str
中的指的是start
的引用,其"nice"
为字符串。
现在,当您尝试执行test = str;
时,test
变量现在引用str
,其引用为start
,因此test
变量应指向{{1}但是再次在下一行"nice"
中,您将测试变量分配给另一个test = "overriden";
,它将测试的引用从str更改为新的。因此,您将获得"overriding"
答案 3 :(得分:0)
String str = "test";
String another_str = "test";
String是一个特殊的。 "测试"的字面意思存储在一个常量池中。
每当您使用文字" test"时,它们都会被引用到该位置。
这就是str == another_str为真的原因;
检查以下输出,你可能会发现:
String str = "test";
String another_str = "test";
//str and another_str points to the same one.
String another_str2=new String(str);//Created a new String and points to taht
System.out.println(str==another_str);//true
System.out.println(str==another_str2);//false, though they have the same string value
答案 4 :(得分:0)
这是因为String是一个不可变对象。
因此,当您使用start
作为创建者参数创建父对象时,test = str
会有效地导致test
指向start
。
但是下一行不会导致开始被覆盖,而只是导致测试指向"overriden"
。
如果您使用了ArrayList(可变对象)并在构造函数中向列表中添加了一个元素,那么将使用新元素修改原始列表。
希望我理解你的问题......