Ich habe Java überprüft, aber ich habe festgestellt, dass der grundlegende Teil subtil war. Halten Sie Ihr Verständnis fest
Referenz übergeben → Übergeben Sie den Speicherort im Speicher Wert übergeben → Wert so übergeben, wie er ist
Nur in Java als Wert übergeben Primitiver Typ → Wert so wie er ist übergeben Objekttyp → Referenz "Wert" übergeben
Übergeben eines Zeigers (Informationen darüber, wo Daten im Speicher gespeichert sind) Damit Sie können den ursprünglichen Wert bearbeiten, indem Sie einen Referenzwert an die Methode übergeben
public void sampleMethod(Object o){
o = 1;
}
Im Neuzustand wird der Referenzwert jedoch neu geschrieben. Selbst wenn danach Änderungen vorgenommen werden, wird der ursprüngliche Wert nicht beeinflusst. Wenn Sie nicht mit zurückkehren, wird ein Referenzwert geboren, der nicht verwendet wird
public void sampleMethod(Object o){
o = new Object();
o = 1;
}
Da String ein Objekttyp ist, wird er als Referenzwert übergeben Aber selbst wenn Sie den Wert ersetzen, ändert sich der ursprüngliche Wert nicht → Weil es sich um eine Klasse handelt, die nicht geändert werden kann Jedes Mal, wenn Sie eine Änderung an String vornehmen, wird hinter den Kulissen ein neues Objekt erstellt (geändert in einen neuen Zeiger). Daher kann das ursprüngliche Objekt nicht geändert werden Daher ist dies eine andere Bewegung als die Übergabe von Werten, selbst wenn das Ergebnis dasselbe ist.
Einbindung einer anderen Klasse in eine Klasse
Es gibt eine Vererbung für die Verwendung anderer Klassen, aber die Verwendung der Vererbung kann zu unerwartetem Verhalten führen
Vererbung
public class InstrumentedHashSet<E> extends HashSet<E> {
private int addCount = 0;
public InstrumentedHashSet(){
}
@Override
public boolean add(E e){
addCount++;
return super.add(e);
}
@Override
//addAll durchläuft das Argument intern und fügt es hinzu
//Daher wird in dieser Klasse das überschriebene Add verwendet und die Anzahl erhöht sich um den Add-Betrag und den Add-All-Betrag.
//Mit anderen Worten, wenn die Zielmethode beim Erben und Überschreiben einer Methode eine andere überschriebene Methode verwendet, ist dies betroffen.
public boolean addAll(Collection<? extends E> c){
addCount += c.size();
return super.addAll(c);
}
public int getAddCount(){
return addCount;
}
}
Zusammensetzung
//Klasse übertragen
//Die Komposition selbst kann gemacht werden, ohne dies separat zu machen.
public class ForwardingSet<E> implements Set<E>{
//Komposition
private final Set<E> s;
//Das hier verwendete Set ist nur dasjenige, das als Argument übergeben wurde
public ForwardingSet(Set<E> s){
this.s = s;
}
public void clear(){
s.clear();
}
public boolean add(E e){
return s.add(e);
}
public boolean addAll(Collection<? extends E> c){
return s.addAll(c);
}
//Überschreiben Sie die abstrakte Methode von Set(Kürzung)
}
//Wrapper-Klasse
public class RapperSet<E> extends ForwardingSet<E>{
private int addCount = 0;
//Übergeben Sie das Set, auf dem die Superklasse basieren soll
public RapperSet(Set<E> e){
super(e);
}
@Override
public boolean add(E e){
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c){
addCount += c.size();
//AddAll wird hier verwendet()Wird in der Oberklasse addAll verwendet()
//Das heißt, addAll der Klasse, die als Argument übergeben wurde().. rapperSet hinzufügen()Macht nichts
return super.addAll(c);
}
public int getAddCount(){
return addCount;
}
}
Recommended Posts