Java如何处理对象引用?

时间:2014-05-25 00:01:27

标签: java oop reference pass-by-reference

如果您引用不同类中的实例化对象,请将更改更新为实际对象或仅更新引用。

public class First {
     List<String> numbers;
     public First(){
         this.numbers.add("one");
         this.numbers.add("two");
     }
}

public class Second{
     First InstanceOfFirst;
     public Second(First F){
           this.InstanceOfFirst = F;
     }
     public void printList(){
          for(String s : this.InstanceOfFirst.numbers){
               System.out.print(i+", ");
          }
     }
}

public class Third {
     First Reference;
     public Third(First F){
         this.Reference = F;
     }
     public void Update(){
         this.Reference.numbers.add("three");
     }
}

所以,让我说我的主要看起来像这样:

public static main(String args[]){
    First F = new Frist();
    Second sec = new Second(F);
    Third  th = new Third(F);
    th.Update();
    sec.printList();
}

我会得到one, twoone, two, three

我想我想问的是:Deos Java在这样引用时会制作不同的对象副本,还是指向同一个对象?

如果我的问题看起来含糊不清,请原谅。

3 个答案:

答案 0 :(得分:2)

Java始终使用按值传递,无论是对象引用还是原语或文字。

在你的情况下,你传递First类对象的引用,现在你将它分配给其他人,它也将指向内存(堆)中的同一个对象,如下面的快照和引用所示它也可以更新被调用方法内对象的状态。

enter image description here

答案 1 :(得分:2)

引用指向堆上的对象。

如果对象是可变的,并且您更改了其状态,那么对该对象的每次引用都会看到更改。

Java不会为您克隆或复制任何内容。如果你真的希望你的对象有自己的副本,你必须创建它。

这只是可变类的问题。像String这样不可改变的人不会受此影响。

public class Person {

    private String name;
    private Date birthDate;

    public Person(String name, Date birthDate) {
        this.name = name; // no need to clone; String is immutable
        this.birthDate = new Date(birthDate.getTime()); // need to clone, since Date is mutable.
    }
}

答案 2 :(得分:0)

你有一个指向同一个对象的引用,因此会产生one, two, three。通过这种方式传递实例,您可以实现一个基本的单例模式(通过让主类保存这些实例)。

Java是按值传递,但是使用对象传递该对象的引用值。