Domanda

Il documento Java dice:

L'oggetto di classe non implementa l'interfaccia clonaugabile, quindi chiamare il metodo clone su un oggetto la cui classe è un oggetto comporterà il lancio di un'eccezione in fase di esecuzione.

Qual è il motivo per cui il metodo clone nella classe Object è protetto?è così ?

Ciò significa che qualsiasi classe che non implementa cloneable genererà un'eccezione CloneNotSupported quando viene richiamato il suo metodo clone.

Ho eseguito un programma di prova

public class Test extends ABC implements Cloneable{

    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("calling super.clone");
            return super.clone();
    }

    public static void main(String[] args) {
        Test t = new Test();
        try{
        t.clone();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ABC{

}

Dal metodo clone di Class Test viene richiamato super.clone?

Perché non genera un'eccezione?

È stato utile?

Soluzione

albero di ereditarietà dei look esempio Test t come

Object
  ABC
    Test

Test anche attrezzi Cloneable il che significa che quando si chiama il metodo sarà chiamato super.clone() il metodo Object del clone. Esso controlla se gli strumenti esempio t l'interfaccia Cloneable. Dal momento che lo fa implementare il metodo non un'eccezione.

Altri suggerimenti

L'interfaccia Cloneable è un'interfaccia marcatore che indica che la classe che implementa supporta il metodo clone. La ragione per cui super.clone () non genera un'eccezione è che l'oggetto di base è chiamato sul Cloneable è per via ereditaria.

Dal Javadoc:

  

A implementa l'interfaccia di classe Cloneable per indicare al metodo Object.clone (), che è legale per quel metodo per effettuare una copia di campo-per-campo di istanze di quella classe.

     

metodo clone di Invocare Oggetto su un'istanza che non implementa i risultati di interfaccia clonabile nel CloneNotSupportedException un'eccezione essere gettato.

See: Cloneable (Java Platform SE 6)

Perché i vostri attrezzi di classe Cloneable. Dal Javadoc di Cloneable:

  

A implementa l'interfaccia di classe Cloneable per indicare al metodo Object.clone (), che è legale per quel metodo per effettuare una copia di campo-per-campo di istanze di quella classe.

Quindi questo permette di metodo Object uso di clone(). È (sempre secondo Javadoc) solo una convenzione per sostituzione clone(). Se non ignorare e il metodo di Object clone() esegue una copia di campo-per-campo, si potrebbe ancora ottenere un CloneNotSupportedException se uno dei campi per sé non è clonabile. Quindi è un buon consiglio per scavalcarlo.

  

Perché il metodo clone della classe Object protected?

In modo che una classe che sceglie di sostenere la clonazione non è costretto di esporre nella sua API pubblica.

Mentre il vostro esempio dimostra, una sottoclasse è consentito di eseguire l'override un metodo con un accesso più rispetto alla versione ereditata del metodo. Non ci si può ridurre l'accesso di un metodo in questo modo.

  

Questo significa che ogni classe, che non implementa clonabile getterà eccezione CloneNotSupported quando il suo metodo clone viene richiamato.

Questo è corretto.

  

Da metodo clone super.clone della Classe di prova sia invocata?

Questo è corretto.

  

Perché non buttare eccezione?

Poiché tu hai dichiarato che gli attrezzi di classe Cloneable. Se non avessi fatto questo, potrebbe un'eccezione ... assumendo che il vostro metodo clone ancora chiamato super.clone().

Questo potrebbe darti la risposta al motivo per cui il metodo è protettoperché il metodo clone è protetto

Non genera eccezioni perché implementi Cloneable.Dalla documentazione Clonabile:

"Una classe implementa l'interfaccia Cloneable per indicare al metodo Object.clone() che è legale per quel metodo creare una copia campo per campo delle istanze di quella classe.Invocare il metodo clone di Object su un'istanza che non implementa l'interfaccia Cloneable comporta la generazione dell'eccezione CloneNotSupportedException."

Ma mentre lo stai implementando, dici all'implementazione dell'oggetto che è legale creare una copia campo per campo in modo che non generi l'eccezione.

direi una buona domanda per confondere gli intervistati:.)

Per quanto riguarda il motivo per cui non genera l'eccezione. Pensare in modo oggetto. Il vostro t oggetto è di prova classe che implementa clonabile. Quando si chiama il metodo super.clone è ancora un oggetto della classe di prova e quindi non c'è alcun motivo per esso per lanciare un'eccezione CloneNotSupported. Se fosse stato un oggetto della classe Object si sarebbe gettato l'eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top