Java和C++的复制构造函数有什么区别?

5

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


3
不,Java仅支持对类的引用,而C++支持值和引用,因此Java不支持复制构造函数,析构函数或赋值运算符。 - Kal
2
@Kal 错了。Java 很好地支持复制构造函数,大多数集合类都提供了它们。 - chrylis -cautiouslyoptimistic-
1
@chrylis:自动复制构造函数?我不这么认为。 - Hovercraft Full Of Eels
1
@HovercraftFullOfEels 内置支持并没有,但是该语言允许使用这种习惯用法而不会出现任何问题。 - chrylis -cautiouslyoptimistic-
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”进行管理。

据我所知,唯一合理的使用finalize方法的情况是清理意外丢失的资源;例如因为有人忘记使用推荐机制来“关闭”它们。

1
@ThomasW - 这只是一个快速示例,展示Java的工作原理...并不是旨在从领域角度讲述有意义的内容。请关注答案试图表达的含义。 - Stephen C
1
@BuzzMoschetti - 手工构造函数的目的是做设计者想要做的任何事情!没有根本性的理由去限制复制构造函数为深层复制,浅层复制,全面复制或部分复制... - Stephen C
好的,我为你的答案点了个赞。但选择一个适当的领域设计对于正确阐述示例是很重要的。设计比代码更微妙,但常常容易出错——也可以说更重要。 - Thomas W
请不要通过在整个数据库中复制和保存副本来更改我的系统/应用程序中的人员或客户姓名!但是,欢迎您复制“订单”或“工作”。 :) - Thomas W
同意。我只是一个上下文狂热者而已。反思一下,我在那条评论中也忽略了一些东西。 - Buzz Moschetti
显示剩余3条评论

5
Java只有对对象的引用,无法内联声明对象(在堆栈或对象中)。
复制构造函数
Java没有此功能。您可以编写一个,但这很少使用。
析构函数
Java没有此功能。它有finalize(),但强烈不推荐使用。
赋值运算符
Java仅限于对象的引用,而非对象本身具有此功能。

@johnchen902 抱歉,它是 finalize() 方法。请参考 http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize()。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接