Java中的clone()方法

Tom*_*Tom 9 java

据我所知,该方法clone()使我们能够在Java中复制对象(无参考).但我也读到,副本很浅.那有什么意义呢?这个clone()方法给了我哪种能力,一个简单的辅助不具备?

Paŭ*_*ann 22

不同之处在于您可以在不修改原始对象的情况下修改克隆对象.

Point p = new Point(1,2);
Point p2 = p.clone();
Point p3 = p;
p2.x = 5;
p3.y = 7;
Run Code Online (Sandbox Code Playgroud)

p3确实改变了反馈p,而改变则反馈p2.

让我们看到的情况是怎样的个人陈述(假设之后1,2,5,7将对象):

Point p = new Point(1,2);

            .-----.    .-----.
 p  ----->  |  x -+--> |  1  |
            |     |    '-----'
            |     |    .-----.
            |  y -+--> |  2  |
            '-----'    '-----'


Point p2 = p.clone();

            .-----.    .-----.    .-----.
 p  ----->  |  x -+--> |  1  | <--+- x  |  <----- p2
            |     |    '-----'    |     |
            |     |    .-----.    |     |
            |  y -+--> |  2  | <--+- y  |
            '-----'    '-----'    '-----'

Point p3 = p;

            .-----.    .-----.    .-----.
 p  ----->  |  x -+--> |  1  | <--+- x  |  <----- p2
            |     |    '-----'    |     |
            |     |    .-----.    |     |
 p3 ----->  |  y -+--> |  2  | <--+- y  |
            '-----'    '-----'    '-----'


p2.x = 5;

            .-----.    .-----.    .-----.    .-----.
 p  ----->  |  x -+--> |  1  |    |  x -+--> |  5  |
            |     |    '-----'    |     |    '-----'
            |     |    .-----.    |     |
 p3 ----->  |  y -+--> |  2  | <--+- y  |  <----- p2
            '-----'    '-----'    '-----'


p3.y = 7;

            .-----.    .-----.    .-----.    .-----.
 p  ----->  |  x -+--> |  1  |    |  x -+--> |  5  |
            |     |    '-----'    |     |    '-----'
            |     |    .-----.    |     |
 p3 ----->  |  y  |    |  2  | <--+- y  |  <----- p2
            '--+--'    '-----'    '-----'
               |     .-----.
               '---> |  7  |
                     '-----'
Run Code Online (Sandbox Code Playgroud)


And*_*s_D 7

一个分配拷贝一个实例的一个变量的参考.甲克隆操作将克隆实例(和分配给克隆的引用).

通过赋值,最终会有多个指向一个对象的变量,通过克隆,您将拥有多个包含多个对象引用的变量.

SomeCloneable a = new SomeCloneable();
SomeCloneable b = a;                     // a and b point to the same object

/* versus */

SomeCloneable a = new SomeCloneable();
SomeCloneable b = a.clone();             // a and b point to the different objects
Run Code Online (Sandbox Code Playgroud)