• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - object clone

VPS Starter Arubacloud
0 głosów
198 wizyt
pytanie zadane 24 września 2020 w Java przez CupraR225 Początkujący (270 p.)

Siemka, przesłoniłem w kodzie metodę clone klasy Object która różni się tym że dla sklonowanego obiektu zmienia nazwę wszystko działa luks ale jak teraz można użyć zwykłego clone od Object??

Kod wygląda tak:

public class MetodaClone implements Cloneable {
	
	String name;
	int version;
	char firstLetterOfName;

	public static void main(String[] args) {
		
		
		MetodaClone object1 = new MetodaClone();
		
		object1.name = "obiekt1";
		object1.version = 7;
		object1.firstLetterOfName = 'o';
		object1.printAll();
		
		try {
			MetodaClone object2 = (MetodaClone)object1.clone();		
			object2.printAll();
			
			//MetodaClone object3 = super.object1.clone();
			//object3.printAll();
			
		} catch (CloneNotSupportedException e) {}
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		MetodaClone copy = (MetodaClone)super.clone();
		copy.name="obiekt2";
		return copy;
	}
	
	protected void printAll() {
		System.out.println(this.name+" "+this.version+" "+this.firstLetterOfName);
	}

}

A chciałbym dla innego obiektu (u mnie object3) wywołać metodę clone z klasy Object która nic nie zmienia a w ten sposób się nie da:

MetodaClone object3 = super.object1.clone();
object3.printAll();

Poda ktoś rozwiązanie bo nie mogę znaleźć odpowiedzi

2 odpowiedzi

0 głosów
odpowiedź 26 września 2020 przez mbabane Szeryf (79,280 p.)
wybrane 26 września 2020 przez CupraR225
 
Najlepsza

Jeśli obiekt B dziedziczy po A i nadpisuje (Override, przesłania) metodę z A to na instancji obiektu B z zewnątrz nie da się zawołać oryginalnej metody z klasy A. Nawet jeśli zrobi się:

A a = new B();

Jeśli warunkowo musisz raz wołać metodę z B a raz z A to w takim przypadku dziedziczenie nie jest najlepszym rozwiązaniem.

0 głosów
odpowiedź 24 września 2020 przez Wiciorny Ekspert (269,120 p.)
edycja 24 września 2020 przez Wiciorny
super.object1.clone();

na obiekcie super powinieneś wywołać metodę klasy rodzica. więc twój zapis jest niepoprawny 

Dla szerszego przykładu

  public Object clone() throws
                CloneNotSupportedException 
    { 
        // Assign the shallow copy to new reference variable t 
        Test2 t = (Test2)super.clone(); 
  
        t.c = new Test(); 
  
        // Create a new object for the field c 
        // and assign it to shallow copy obtained, 
        // to make it a deep copy 
        return t; 
    } 

 

dokumentacja 

dokumentacja 
 

protected Object clone()
                throws CloneNotSupportedException

Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression:

 x.clone() != x

will be true, and that the expression:

 x.clone().getClass() == x.getClass()

 

komentarz 25 września 2020 przez CupraR225 Początkujący (270 p.)

No ok warunek

System.out.println(object1.getClass()==object2.getClass()); //true

się zgadza ale ja chciałbym w tym miejscu

MetodaClone object3 = (MetodaClone)super.clone();

powiedzieć kompilatorowi od czego ma zrobić kopie i ma to być object1 tylko nie wiem jak to przekazać bo w nawiasie nic nie przyjmuje

komentarz 25 września 2020 przez Wiciorny Ekspert (269,120 p.)

żeby sklonowac obiekt1 to musisz wywołać clone na obiekcie1, nie mozesz klonować " obiektu X" na podstawie obiektu super,  bo to jest tylko sytuacjca w której chces zkopiować obiekt na bazie "zaimplementowanej klasy z metodą clone"

 

Jeśli chcemy utworzyć głęboką kopię obiektu X i umieścić go w nowym obiekcie Y, wówczas tworzona jest nowa kopia wszelkich pól obiektów, do których istnieją odniesienia, a odniesienia te są umieszczane w obiekcie Y. Oznacza to wszelkie zmiany dokonane w polach obiektów, do których istnieją odniesienia, w obiekcie X lub Y zostanie odzwierciedlone tylko w tym obiekcie, a nie w drugim. W poniższym przykładzie tworzymy głęboką kopię obiektu.

komentarz 25 września 2020 przez CupraR225 Początkujący (270 p.)
Ale ja tylko chcę odwołać się do metody clone z klasy Object, która została przesłonięta przez metodę clone w mojej klasie a chciałbym odwołać się do tej z Object!!!
komentarz 26 września 2020 przez Wiciorny Ekspert (269,120 p.)

nie mozesz tego zrobić... widzę że brakuje Ci zrozumienia podstaw java.
Żeby zrobić to musisz dla KLASY OBIEKTU NR 3 - TEGO KTÓREGO CHCESZ KOPIOWAĆ ZAIMPLEMENTOWAC METODE CLONE i w tej metodzie ZROBIĆ "SUPER.CLONE()" 
 

 

 

The clone method is meant to make a deep copy. Make sure you understand the difference between deep and shallow copies. In your case a copy constructor may be the pattern you want. In some cases you can't use this pattern however, for example because you're subclassing class X and you don't have access to the constructor of X that you need. If X overrides its clone method correctly (if necessary) then you could make a copy in the following way:


    @Override
    public Y clone() {
        final Y clone;
        try {
            clone = (Y) super.clone();
        }
        catch (CloneNotSupportedException ex) {
            throw new RuntimeException("superclass messed up", ex);
        }
        clone.field = this.field.clone();
        return clone;
    }

}

 

komentarz 26 września 2020 przez Wiciorny Ekspert (269,120 p.)

@CupraR225, Cloneable to interfers... musisz zaimplementować metode, nie przysłaniasz jej tylko ją implementujesz bo to jest interferjs 

komentarz 26 września 2020 przez CupraR225 Początkujący (270 p.)

No ja rozumiem ale kiedy chce korzystać z oryginalnej metody od Object oraz własnej przesłoniętej to czy poprawny jest taki sposób:

protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	protected Object clone(String str) throws CloneNotSupportedException {
		MetodaClone mc = (MetodaClone)super.clone();
		mc.name = str;
		return mc;
	}

Albo w ten sposób:

@Override
	protected Object clone() throws CloneNotSupportedException {
		if (this.id%2==0) {
			return super.clone();
		}
		else {
			MetodaClone mc = (MetodaClone)super.clone();
			mc.name = "nieparzysty";
			return mc;
		}
	}

 

Podobne pytania

0 głosów
2 odpowiedzi 369 wizyt
pytanie zadane 19 marca 2019 w Systemy operacyjne, programy przez Krystek102 Bywalec (2,440 p.)
+1 głos
2 odpowiedzi 135 wizyt
pytanie zadane 13 lutego 2021 w JavaScript przez lukasz21 Obywatel (1,090 p.)
+1 głos
2 odpowiedzi 126 wizyt
pytanie zadane 28 lipca 2020 w JavaScript przez kingkushlee Gaduła (3,960 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...