5

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

4

2 回答 2

8

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是清理意外丢失的资源;例如,因为有人忘记使用推荐的机制“关闭”它们。

于 2013-09-28T03:01:22.860 回答
5

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

复制构造函数

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

, 析构函数

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

赋值运算符

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

于 2013-09-28T03:04:09.497 回答