2012-02-06 3 views
7
import java.util.*; 
import java.lang.*; 

public class Test{ 
    public static void main(String[] argv){ 
     String s1="abc"; 
     String s2=(String) s1.clone(); 
    }  
} 

Dlaczego ten prosty program testowy nie działa?Klon() w języku Java

+6

W jaki sposób to nie działa? – Jivings

+0

Wyjątek w wątku "główny" wyjątek java.lang.RuntimeException: nieskompilowany kod źródłowy - nierejestrowany wyjątek java.lang.CloneNotSupportedException; musi zostać złapany lub zadeklarowany jako wyrzucony \t w teście.Test.main (Test.java:9) Java Wynik: 1 – user1192813

Odpowiedz

19

clone to metoda klasy Object. Aby klasa była "klonowalna", powinna implementować interfejs znacznika Cloneable. Klasa String nie implementuje tego interfejsu i nie zastępuje metody klonowania, stąd błąd.

Mam nadzieję, że powyższy fragment jest w celach edukacyjnych, ponieważ nigdy nie powinien czuć potrzebę, aby zadzwonić clone na ciągi znaków w Java zważywszy, że:

  1. Ciągi w Javie są niezmienne. Udostępnij je metodom/klasom
  2. Istnieje już konstruktor new String(String), który działa jak konstruktor kopii i jest prawie równoważny z twoją rozmową clone().
+2

Efektywna pozycja Java 11: Zastąpić klon ostrożnie. (Lub jeszcze lepiej, po prostu użyj konstruktorów kopii i tym podobnych, innych niż klon.) –

+0

Heh, przejdź do tego posta, idź. –

+1

Nie kompiluje się. 'clone' nie jest metodą publiczną w' Cloneable', więc implementacja nie ma znaczenia. –

6

Object.clone() jest chroniony. Jest to trudne do zastosowania API.

Zwykle eksponuje się clone(), gdy rozszerza się obiekt poprzez poszerzenie widoczności metody.

Klonowanie na dowolnym ciągu ma niewielkie znaczenie, ponieważ jest zarówno niezmienne final, jak i niezmienne.

Istnieje powód, aby skopiować ciąg; można to zrobić:

String s1 = ...; 
String s2 = new String(s1) 
+1

Rzadko trzeba skopiować ciąg znaków, a nie wyjaśniłeś, dlaczego tak się stało ([to pytanie] (http://stackoverflow.com/questions/390703/what-is-itpose-of-the-expression) -new-string-in-java) robi). –

1

clone() to metoda chroniona w klasie Object. Jeśli chcesz, aby klasa była klonowalna, ogólny wzór to implementacja Cloneable i upublicznienie tej metody.

1

Oczywiście nie można go skompilować. Object.clone ma chroniony dostęp.

Beyond jest dostępny w samej i do kodu w ramach tego samego pakietu klasy ..., członek chronione mogą być dostępne z klasy poprzez referencje obiektów, które są co najmniej takiego samego typu jak klasa

1

java.lang.Cloneable interfejs muszą być realizowane przez klasę, której klon obiekt chcemy utworzyć. Jeśli nie wykonamy implementowania interfejsu Klonowalny, metoda clone() generuje CloneNotSupportedException.

Metoda clone() jest zdefiniowana w klasie Object. Składnia metody klon() jest następujący:

protected Object clone() throws CloneNotSupportedException 
0

Dla klasy być „Cloneable” należy realizować Cloneable interfejs znacznika. Klasa String nie implementuje tego interfejsu i nie zastępuje metody klonowania, stąd błąd.

chronione Klon obiektu() rzuca CloneNotSupportedException tworzy i zwraca dokładną kopię (klon) tego obiektu.

Łańcuchy w języku Java są niezmienne. Zapraszam do dzielenia się nimi metodami/klasami Istnieje już konstruktor new String (String), który działa jak konstruktor kopiowania i jest prawie równoważny twojemu wywołaniu clone().

Zwykle eksponuje się klon(), gdy rozszerza się obiekt poprzez poszerzenie widoczności metody.

Klonowanie na dowolnym ciągu ma niewielkie znaczenie, ponieważ jest zarówno ostateczne, jak i niezmienne.