【问题标题】:Knowing about copy constructor in java了解java中的复制构造函数
【发布时间】:2016-08-02 14:46:00
【问题描述】:

我们知道java不支持引用调用,而且如果使用复制构造函数我们使用值调用,那么复制构造函数将无限次递归调用自身。那么复制构造函数如何在java中工作? 提前致谢。

【问题讨论】:

  • 什么拷贝构造函数?
  • 因为传递的值是引用的值。实例并非每次都被复制。
  • @4castle 复制构造函数:-用于从相同类类型的另一个类对象复制一个类对象
  • 是的,但是为什么它会递归调用自己呢?复制构造函数不调用其他构造函数。
  • the value of an object is its reference. - 不,引用的值是对该对象的引用。一个对象的价值就是它的内容。作为String s = new String("reference me"); 中的示例,s 将是对正在创建的字符串的引用。如果您执行String s2 = s;,您将创建另一个指向同一个对象的引用,并且您不执行任何对象构造。

标签: java copy copy-constructor


【解决方案1】:

与 Java 中的复制构造函数最接近的等价物是覆盖 Object 类的 clone() 方法。 javadocs 很好地解释了它的用法。

【讨论】:

  • “复制构造函数”的另一种形式类似于MyClass(MyClass source) { ... }
【解决方案2】:

如果使用复制构造函数,我们使用按值调用

Java 没有内置的复制构造函数。您可以创建自己的一个,但这仅在您明确调用它时使用。对于 Java 来说,它只是另一个没有特殊含义的构造函数。

Java 只有原始变量和引用变量,当它们被复制时,不会调用任何方法或构造函数。

例如在此示例中,复制的是引用,而不是对象。

Integer i = 5; // A *reference* to an Integer object.
Integer i = j; // A *reference* to the same object.

复制构造函数会无限次递归调用自身。

一个常见的误解是 Java 有 Object 变量类型,而实际上它没有。

【讨论】:

  • ,根据你在java中的说法,这不起作用:class Copy { int x,y;复制(int x,int y){ this.x=x;这个.y=y; } void show() { System.out.println(x); System.out.println(y); } 复制(复制 z){ this.x=z.x;这个.y=z.y; } public static void main(String... s) { Copy c1=new Copy(10,20); c1.show();复制 c2=新复制(c1); c2.show(); } }
  • @sagg1295 请查看您的评论。以目前的形式,它没有任何意义。
  • @sagg1295 我是说这个问题没有意义,因为它不适用于 Java。没有 Object 或 struct 变量类型,因此没有复制构造函数。 (但 Java 10 可能有它们)
  • @sagg1295 Copy(Copy z) { this.x=z.x; this.y=z.y; } 可以被视为某种复制构造函数(尽管不是 C++ 使用它们的方式),这是可能的。此外,正如我已经提到的,不涉及递归。您将引用 z 传递给构造函数,并使用它来访问被引用对象的值 xy(并且因为它是一个引用 - 甚至可以称为指针 - 它可以为空)。
  • @sagg1295 我已经更新了我的答案,说您可以执行类似复制构造函数的操作,但必须显式调用它,因为它没有隐式的语言支持。没有递归的风险。
【解决方案3】:

任何对象的 Java 复制构造函数都是该对象的深层副本。 例如,

 public Car(String motorShow, double price) {
     this.motorShow = motorShow;
     this.price = price;
 }  ^ ordinary constructor for a Car object


//the copy constructor for Car:
  public Car(Car other) {
    this.motorShow = other.motorShow;
    this.price = price;
  }   
/* Simply in the main class write Car c2 = new Car(c1);    

 this basically will create a copy of c1 of, and note that changing the attributes of one of the objects won't affect the other since it's a deep copy; unlike this for example:
 Car c1 = c2;
 here, changing any attribute of c1 or c2 will affect the other, i.e two pointers for the same space or reference in memory  */

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2017-10-30
    • 2014-08-04
    • 2011-08-10
    • 1970-01-01
    • 2014-03-24
    • 2013-10-13
    相关资源
    最近更新 更多