【问题标题】:difference between Java and C++ copy constructorJava和C++复制构造函数的区别
【发布时间】:2013-10-04 10:56:28
【问题描述】:

我很好奇 Java 是如何支持复制构造函数的,它与 C++ 有什么不同?我想从故事的编译器方面了解执行三个规则(复制构造函数、析构函数、赋值运算符)的逻辑的 Java 等价物。

【问题讨论】:

  • 不,java 仅支持对类的引用,而 c++ 支持值和引用,因此 java 不支持复制 ctors、dtors 或分配操作
  • @Kal 错了。 Java 很好地支持复制构造函数,并且大多数 Collections 类都提供它们。
  • @chrylis:自动复制构造函数?我不这么认为。
  • @HovercraftFullOfEels 内置支持,没有,但是语言允许成语没有任何问题。

标签: java c++ copy-constructor


【解决方案1】:

Java 对复制构造函数没有特定的语言支持。相反,您只需在构造函数中手动编写状态复制代码;例如

public class Person {
    private String firstName;
    private String lastName;

    public Person(Person other) {
        this.firstName = other.firstName;
        this.lastName = other.lastName;
    }
    ...
}

我想从故事的编译器方面了解执行三个规则(复制构造函数、析构函数、赋值运算符)的逻辑的 Java 等价物。

复制构造函数如上。真的只是一个(简单的)设计模式。

Java 不提供与 C++ 赋值运算符加载等效的功能。 Java 支持原始类型和引用类型的赋值,但不像 C++ 那样支持对象的赋值。在 Java 中赋值时需要特殊操作是不常见的。而在需要这样做的情况下,习惯上将逻辑放入一个setter方法中。

Java 支持finalize 方法,在某些方面类似于 C++ 的析构函数。主要区别在于finalize 方法是对对象而不是引用变量的操作,并且它们通常在对象的最后一个引用超出范围后很长时间才被调用。

但是,您很少需要使用finalize 方法:

  • Java 是一种完全垃圾回收的语言,内存管理的最佳策略是让 GC 处理它。

  • 其他资源最好使用“try / finally”或“try with resources”进行管理。

AFAIK,finalize 方法的唯一声音用例是用于清理意外丢失的资源;例如因为有人忘记使用推荐的机制“关闭”它们。

【讨论】:

  • 复制通常用于可变的“值”对象——例如 MutableRectangle(如果你需要/想要这样的类)。可以说,对于“身份”对象/实体(例如 Person)来说,它并不是真正明智/有用的。
  • 这段代码 sn-p 是正确的想法,但如果它支持一些深层复制操作会更能说明问题,这就是手动复制构造函数的目的。字符串和原生标量太容易了。
  • @ThomasW - 这是一个展示 Java 工作原理的快速示例……从领域的角度来看,它并不是有意义的。请专注于答案的意思。
  • @BuzzMoschetti - 手动构造函数的目的是做设计师打算做的任何事情!没有根本的理由将复制构造函数限制为深复制或浅复制或完全复制或部分复制......
  • @ThomasW - 此外,在某些应用程序中,Person 对象的名称可能需要更改!
【解决方案2】:

Java 只有对对象的引用。您不能声明内联(在堆栈或对象中)对象。

复制构造函数

Java 没有。你可以写一个,但很少这样做。

,析构函数

Java 没有。它有finalize(),但非常不鼓励这样做。

赋值运算符

Java 没有对象,只有对象的引用。

【讨论】:

猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2018-08-27
  • 1970-01-01
  • 2013-02-03
  • 2014-05-18
  • 2020-05-14
相关资源
最近更新 更多