【问题标题】:How Does Java handle Object references? [duplicate]Java 如何处理对象引用? [复制]
【发布时间】:2014-07-14 02:04:38
【问题描述】:

如果您在不同的类中引用一个实例化的对象,更改是否更新为实际对象或只是引用..

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 在这样引用时会制作不同的对象副本,还是它们指向同一个对象??

如果我的问题似乎含糊不清,请原谅..

【问题讨论】:

标签: java oop reference pass-by-reference


【解决方案1】:

Java 总是使用按值传递,无论它是对象引用、原始还是字面量。

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

【讨论】:

    【解决方案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.
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      Java 是按值传递的,但对于 Objects,它会传递该对象引用的值。

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 1970-01-01
        • 2019-09-30
        • 2017-11-24
        • 2017-06-27
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        相关资源
        最近更新 更多