1 Clone de objeto nativo protegido () lança clonenotsupportedException;
1. Método modificado por palavras -chave nativas
A palavra -chave nativa em Java indica que esse método é um método local [descrição nativa de Java]. Além disso, a eficiência da execução dos métodos de modificação nativa é maior que a das modificações não nativas .
2. O método é modificado por protegido
Quando uma classe substitui o método clone (), ele precisa ser modificado em um modificador de acesso público, para garantir que todas as outras classes possam acessar esse método dessa classe.
3. Método lança CLONENOTSupportEdException Exception
Se uma classe quiser substituir o método clone (), ele deve implementar a própria interface java.lang.cloneable , caso contrário, uma clonenotsupportedException será lançada.
2. O papel do clone ()
Nota: Os objetos aqui se referem especificamente a tipos complexos.
1. Simples = operação
Sabemos que objetos de tipos complexos em Java são todos os tipos de referência e geralmente armazenam os endereços de memória dos objetos. Portanto, não podemos simplesmente atribuir a operação de valor como o = operador. Atribuímos um objeto A a outro objeto B e simplesmente atribuímos o endereço de memória do objeto A a B, para que os dois estejam apontando para o mesmo endereço de memória. A conseqüência disso é que as modificações em um dos objetos afetarão o outro objeto. A figura a seguir mostra:
Pessoa p1 = nova pessoa (); pessoa p2 = p1;
2. Clone ()
Usando o método clone (), você pode criar rapidamente uma cópia de um objeto e os dois objetos apontam para diferentes endereços de memória. A figura a seguir mostra:
Pessoa P1 = New Pessoa (); Pessoa P2 = P1.Clone ();
3. Clone raso e clone profundo1, clone raso (cópia rasa)
O clone raso refere -se a campos no próprio objeto clone, não no objeto clone. Ligue apenas para Super.Clone (), apenas clone raso. Embora o objeto copiado aponte para diferentes endereços de memória, os campos no objeto ainda apontam para o mesmo endereço de memória que o objeto anterior.
classe pública SHROWLONELPLONE implementa clonável {name public string; INT AGRIBUIL PÚBLICA; pessoa pública; public SHOULLCLONE () {} public SHOULLONE (Nome da String, Int Age, Pessoa Pessoa) {this.name = Name; this.age = idade; this.person = pessoa; } @Override public SHOULLCLONE CLONE () {SHOULLCLONE C = NULL; tente {c = (shallowclone) super.clone (); retornar c; } catch (clonenotsupportEdException e) {e.printStackTrace (); } retornar c; } public static void main (string [] args) {pessoa p = new Person (); p.name = "p"; P.age = 10; Shallowclone c1 = new shallowclone ("jim", 18, p); System.out.printf ("Antes do clone: c1 = %s, c1.person = %s/n", c1, c1.person); Shallowclone c2 = c1.clone (); System.out.printf ("Após o clone: c2 = %s, c2.person = %s/n", c2, c2.person); }}Run Main () Saída:
Antes do clone: c1 = cre.sample.test.object.shallowclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after clone: c2 = cre.sample.test.object.slowClone@TerSaSMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM.Test.25F1F1F1F1F1.
Dessa maneira, o endereço de memória do objeto raso mudou, mas o endereço de memória do campo Pessoa no objeto não mudou;
2 clone profundo (cópia profunda)
O clone profundo refere -se aos campos no próprio objeto clone e também ao objeto clone.
/*** Exemplo de código de clone profundo* criado por Cregu em 2016/6/9. */classe pública DeepClone implementa cloneable {public string name; INT AGRIBUIL PÚBLICA; pessoa pública; public DeepClone () {} public DeepClone (Nome da String, Int Age, Pessoa) {this.name = Name; this.age = idade; this.person = pessoa; } @Override public DeepClone clone () {DeepClone c = null; tente {c = (DeepClone) super.clone (); c.Person = PERSON.CLONE (); retornar c; } catch (clonenotsupportEdException e) {e.printStackTrace (); } retornar c; } public static void main (string [] args) {pessoa p = new Person (); p.name = "p"; P.age = 10; DeepClone C1 = novo DeepClone ("Jim", 18, P); System.out.printf ("Antes do clone: c1 = %s, c1.person = %s/n", c1, c1.person); DeepClone c2 = c1.clone (); System.out.printf ("Após o clone: c2 = %s, c2.person = %s/n", c2, c2.person); }}Run Main () Saída:
Antes do clone: c1 = cre.sample.test.object.deepclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after clone: c2 = cre.sample.test.object.deepClone@742808B3, c2.person.
Nesse caso, o endereço de memória do objeto DeepClone mudou, mas o endereço de memória do campo Pessoa no objeto também mudou.
A análise abrangente acima do método clone do objeto Java é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.