参考类型是通过引用复制的吗?

时间:2014-08-21 03:17:30

标签: java

是的,还在学习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对象的成员测试?

5 个答案:

答案 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(可变对象)并在构造函数中向列表中添加了一个元素,那么将使用新元素修改原始列表。

希望我理解你的问题......