Pergunta

Se eu tiver:

class foo implements Cloneable

e, em seguida, fazer:

bar = new foo();
bar.clone();

Eu recebo uma cópia superficial sem a necessidade de escrever qualquer código bar.clone() como eu normalmente teria de fazer quando eu implementar uma interface.

O meu entendimento é que as funções de uma interface deve ser preenchida pela classe que implementa-lo, e Object.clone() não tem nenhuma implementação (de acordo com os documentos, "o objeto de classe não-se implementar a interface Cloneable")

Então, onde é que o meu clone superficial vem? Onde está o código que implementa bar.clone() se Object.clone() não tem nenhuma implementação? Estou confuso.

Foi útil?

Solução

Seja muito cuidado usando clone. Na verdade, gostaria de evitá-lo completamente. Tenho não precisava. MAS ... Dito isto, o melhor discussão do tema que eu já li é por Joshua Bloch, em Effective Java. Leia Item 11:. "Clone Override judiciosamente"

Por favor, faça um favor e ler esse item. Na verdade, eu recomendo a leitura de todo esse capítulo (e do resto do livro). Tudo o que você precisa saber sobre clone e por isso que eu adverti-lo sobre o que é lá dentro.

Espero que isso ajude.

Outras dicas

Object.clone () tem uma implementação:

http: // java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone ()

Este link explica a interface Cloneable: http://java.sun.com/j2se /1.5.0/docs/api/java/lang/Cloneable.html

Um objeto deve implementar a interface Cloneable, a fim de chamar o método clone (), caso contrário, ele lança um CloneNotSupportedException.

Por definição, todas as classes em Java estender a classe base objeto e classe Object tem um método clone () padrão, embora próprio objeto não implementa Cloneable. clone da classe Object () método será chamado se você não substituí-lo a si mesmo.

Se eu tiver: "implementos classe foo cloneable "

e depois fazer: bar = new foo (); bar.clone ();

Eu recebo uma cópia superficial sem a necessidade para escrever qualquer código bar.clone () como eu normalmente precisam fazer quando eu implementar uma interface.

Isso só funcionará se você está chamando-o dentro da classe "foo", porque o método .clone () herdada de Object está protegida.

O meu entendimento é que um funções de interface devem ser preenchidas no pela classe que implementa-lo, e Object.clone () não tem nenhuma implementação (De acordo com os documentos, "o objeto de classe não em si implementar o Interface Cloneable ")

(1) Object.clone() tem uma implementação. Faz uma cópia superficial do objeto se os implementos objeto Cloneable. (2) O método .clone() não faz parte de qualquer interface. (3) Ter um método .clone() e implementar a interface Cloneable são coisas completamente distintas. Você só precisa implementar a interface Cloneable se você pretende fazer uso de método Object de clone; no entanto, esta é a maneira recomendada para escrever um método clone para sua classe -. para obter a sua cópia do método clone da superclasse, o que eventualmente vai até método Object de clone

O meu entendimento é que as funções de uma interface deve ser preenchida pela classe que implementa-lo, e Object.clone () não tem nenhuma implementação (de acordo com os documentos, "o objeto de classe não-se implementar a interface Cloneable")

há uma diferença entre dizer Object.clone () não tem nenhuma implementação e o objeto de classe em si mesma não implementar a interface Cloneable

método clone do objeto não tem aplicação, que faz memória de cópia do objeto que chamou método clone.

Você está certo, classe Object não implementa cloneable, tudo que faz é verificar o objeto é cloneable ou não.

o ponto de resposta acima é você ler algum livro, eu acho que pode dar uma solução rápida de modo a responder à sua pergunta

Então onde é que o meu clone superficial vem? método clone do objeto

Onde está o código que implementa bar.clone () se Object.clone () não tem nenhuma implementação? ele tem implementação, escrito em código nativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top