我很好奇Java如何支持复制构造函数,它与C ++有什么不同?我想从故事的编译器端理解Java的等效逻辑来执行三级规则(复制构造函数,析构函数,赋值运算符)。
答案 0 :(得分:8)
Java对副本构造函数没有特定的语言支持。相反,你只需在构造函数中手动编写状态复制; e.g。
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
方法的唯一声音用例,用于清理意外丢失的资源;例如因为有人忘记使用推荐的机制“关闭”他们。
答案 1 :(得分:5)
Java只有对象的引用。您不能声明内联(在堆栈或对象中)对象。
复制构造函数
Java没有。你可以写一个,但很少这样做。
,析构函数
Java没有。它有finalize()
但是非常气馁。
赋值运算符
Java没有一个用于对象,只有对象的引用。