[Java] Objektklasse

Was ist die Objektklasse?

toString-Methode

//Implementierte toString-Methode in der Person-Klasse
public class Person {
  private String firstName;
  private String lastName;
  public Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  @Override
  //Wählen Sie die Felder aus, die die Klasse charakterisieren, und konvertieren Sie sie in Zeichenfolgen
  public String toString() {
    return String.format("Sie ist,%s %s.",
        this.lastName, this.firstName);
  }
  //Stellen Sie es einzelnen Gettern zur Verfügung
  public String getLastName() {
    return this.lastName;
  }
  public String getFirstName() {
    return this.firstName;
  }
}
public class ToStringBasic {
  public static void main(String[] args) {
    var p = new Person("Eilish", "Billie");
    System.out.println(p); //Sie ist Billie Eilish.
  }
}

entspricht Methode

//firstName/Implementieren Sie die Methode equals in der Klasse Person des Felds lastName
public class Person {
  private String firstName;
  private String lastName;

  public Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  //Gleichwertig, wenn Vor- und Nachname gleich sind
  @Override
  public boolean equals(Object obj) {
    //Beurteilung der Identität
    if (this == obj) {
      return true;
    }
    //Beurteilung der Gleichwertigkeit
    //Typprüfung mit instanceof und type cast(Niedergeschlagen)
    if (obj instanceof Person) {
      var p  = (Person)obj;
      //Beurteilung der Feldgleichheit(String-Klasse entspricht Methode)
      return this.firstName.equals(p.firstName) &&
          this.lastName.equals(p.lastName);
    }
    //False, wenn die Art des Arguments obj unterschiedlich ist
    return false;
  }
}

Regeln, die mit Gleichheit zu befolgen sind

//Problematischer Code, der die Symmetrie verletzt
public class BusinessPerson extends Person {
  private String department;

//Abteilungsvergleich hinzugefügt
  public BusinessPerson(String firstName, String lastName, String department) {
    super(firstName, lastName);
    this.department = department;
  }

  @Override
  public boolean equals(Object obj) {
    //Identität
    if (this == obj) {
      return true;
    }
    //Gleichwertigkeit
    if (obj instanceof BusinessPerson) {
      var bp = (BusinessPerson)obj;
      return super.equals(bp) &&
          this.department.equals(bp.department);
    }
    return false;
  }
}
public class EqualsBasic {
  public static void main(String[] args) {
    var p = new Person("Yumi", "Matsutoya");
    var bp = new BusinessPerson("Yumi", "Matsutoya", "Komponist");
    System.out.println(p.equals(bp));  //true
    System.out.println(bp.equals(p));  //false
  }
}
//Problematischer Code, der den Übergang verletzt
public class BusinessPerson extends Person {
  private String department;

  public BusinessPerson(String firstName, String lastName, String department) {
    super(firstName, lastName);
    this.department = department;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }

    if (obj instanceof Person) {
      //Geben Sie für BusinessPerson alle Felder vergleichen ein
      if (obj instanceof BusinessPerson) {
        var bp  = (BusinessPerson)obj;
        return super.equals(bp) &&
            this.department.equals(bp.department);
      //Personentyp ignoriert Abteilungsfeld und vergleicht
      } else {
        return super.equals(obj);
      }
    }
    return false;
  }
}
public class EqualsBasic {
  public static void main(String[] args) {
    var p = new Person("Yumi", "Matsutoya");
    var bp1 = new BusinessPerson("Yumi", "Matsutoya", "Komponist"); 
    var bp2 = new BusinessPerson("Yumi", "Matsutoya", "Sänger");
    System.out.println(bp1.equals(p)); //true
    System.out.println(p.equals(bp1)); //true
    System.out.println(p.equals(bp2)); //true
    System.out.println(bp1.equals(bp2)); //falsche Übergangsverletzung!
  }
}

Hash-Wert des Objekts abrufen

public class ObjectHash {
  private boolean boolValue;
  private int intValue;
  private long longValue;
  private float floatValue;
  private double doubleValue;
  private String stringValue;
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;

    //Die folgende Berechnung unter Verwendung des Hashwerts
    //hash = result*31^(n) + v_1*31^(n-1) +..+ v_n
    //v_1~v_n ist der int-Wert des Feldes
    //n ist die Anzahl der Felder
    result = prime * result + (boolValue ? 1231 : 1237);
    long temp;
    //Der Rückgabewert der doubleToLongBits-Methode ist ein langer Typ
    temp = Double.doubleToLongBits(doubleValue);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    result = prime * result + Float.floatToIntBits(floatValue);
    result = prime * result + intValue;
    result = prime * result + (int) (longValue ^ (longValue >>> 32));
    result = prime * result + ((stringValue == null) ? 0 : stringValue.hashCode());
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    ObjectHash other = (ObjectHash) obj;
    if (boolValue != other.boolValue)
      return false;
    if (Double.doubleToLongBits(doubleValue) != Double.doubleToLongBits(other.doubleValue))
      return false;
    if (Float.floatToIntBits(floatValue) != Float.floatToIntBits(other.floatValue))
      return false;
    if (intValue != other.intValue)
      return false;
    if (longValue != other.longValue)
      return false;
    if (stringValue == null) {
      if (other.stringValue != null)
        return false;
    } else if (!stringValue.equals(other.stringValue))
      return false;
    return true;
  }
}

Objekte vergleichen

//Beispiel für die Implementierung der compareTo-Methode in der Person-Klasse
//<Person>Objekt wird verglichen
//Sortieren nach Nachnamen Wörterbuch
public class Person implements Comparable<Person> {
  private String firstNameKana;
  private String lastNameKana;

  public Person(String firstNameKana, String lastNameKana) {
    this.firstNameKana = firstNameKana;
    this.lastNameKana = lastNameKana;
  }
  //Beurteilung der Größe nach Nachname und Name Kana
  @Override
  //Zunaechst`Feld lastNameKana`Großer und kleiner Vergleich
  public int compareTo(Person o) {
    //Wenn gleich`Feld firstNameKana`Großer und kleiner Vergleich
    if (this.lastNameKana.equals(o.lastNameKana)) {
      return this.firstNameKana.compareTo(o.firstNameKana);
    } else {
      return this.lastNameKana.compareTo(o.lastNameKana);
    }
  }

  @Override
  public String toString() {
    return this.lastNameKana + " " + this.firstNameKana;
  }
}
import java.util.Arrays;
import java.util.Arrays;

public class CompareBasic {
    public static void main(String[] args) {
        var data = new Person[] {
                new Person("Harry", "Potter"),
                new Person("Ron", "Weasley"),
                new Person("Hermione", "Granger"),
                new Person("Albus", "Dumbledore"),
                new Person("Severus", "Snape"),
                new Person("Serius", "Black"),
        };
        Arrays.sort(data);
        System.out.println(Arrays.toString(data));
        //[Black Serius, Dumbledore Albus, Granger Hermione, Potter Harry, Snape Severus, Weasley Ron]
    }
}

Objekt duplizieren

//Implementieren Sie die klonbare Schnittstelle, um die Replikation explizit zuzulassen
public class Person implements Cloneable {
  private String firstName;
  private String lastName;

  public Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  //Passen Sie den Rückgabewert an den Personentyp anstelle des ursprünglichen Objekts an und sparen Sie sich das Casting auf der Benutzerseite
  @Override
  public Person clone() {
    Person p = null;
    try {
      //Rufen Sie die Klonmethode der Object-Klasse auf
      p = (Person)super.clone();
    } catch (CloneNotSupportedException e) {
      throw new AssertionError();
    }
    return p;
  }

  @Override
  public String toString() {
    return this.lastName + this.firstName;
  }
}

Kopieren, wenn das Feld einen Variablentyp enthält

public class Person implements Cloneable {
  private String firstName;
  private String lastName;
  private String[] memos;

  public Person(String firstName, String lastName, String[] memos) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.memos = memos;
  }

  @Override
  public Person clone() {
    Person p = null;
    try {
      p = (Person) super.clone();
      //Duplizieren Sie ein Array-Objekt explizit, indem Sie die Klonmethode des entsprechenden Felds aufrufen
      p.memos = this.memos.clone();
    } catch (CloneNotSupportedException e) {
      throw new AssertionError();
    }
    return p;
  }

  @Override
  public String toString() {
    return  String.format("%s%s(%s)",
        this.lastName, this.firstName, this.memos[1]);
  }
}

Recommended Posts

[Java] Objektklasse
Java-Klassenmethoden
[Java] Klassenvererbung
Java-Scanner-Klasse
Java (abstrakte Klasse)
[Java] Verschachtelte Klasse
Anonyme Java-Klasse
Über die Java-Klasse
[Java] Abstrakte Klasse
Lokale Java-Klasse
Über die Klassenteilung (Java)
JAVA-Objektzuordnungsbibliothek
Java Objektgrößengefühl
Überprüfung der Java-Innenklasse
Feld für den Java-Klassentyp
Java-Programmierung (Klassenmethode)
Informationen zur Java String-Klasse
Java-Programmierung (Klassenstruktur)
Über die abstrakte Klasse von Java
Java ab Anfänger, Klassendeklaration / Objekterzeugung
Java-Memo-Teilzeichenfolge (Standardklasse)
Java-Tipps - Modifikatoren der StataticUtility-Klasse
Länge des Java-Memos (Standardklasse)
[Implementierung] Java Prozessklassennotizen
Informationen zu Java Class Loader-Typen
Verwendung der Java-Klasse
[Java] Komparator der Collection-Klasse
Definition und Instanziierung von Java-Klassen
Muskel Java Objektorientierter Tag 1
Java
Zusammenfassung der Java Math Klasse
[Java] Was ist Klassenvererbung?
Java-Klasse Variable Klassenmethode
Java
[Java] Objektoperation der ArrayList-Klasse (AOJ ④ Inversion der Zahlenfolge)
[Java-Grundlagen] Was ist Klasse?
[Jackson] JSON⇔Objekt-Konvertierungsklasse
Erstellen Sie mit JAVA eine unveränderliche Klasse
Muskel Java Objektorientierter Tag 2 ~ Vererbung ~
Warum werden Klassenvariablen benötigt? [Java]
Rufen Sie Kotlins versiegelte Klasse von Java aus an
[Java] Objektorientierte Syntaxklassenmethode / Argument
Verschiedene Methoden der Java String Klasse
So zerlegen Sie eine Java-Klassendatei
Kotlin-Klasse zum Senden an Java-Entwickler
[Effektives Java] Veraltete Objektreferenzen entfernen
StringBuffer- und StringBuilder-Klasse in Java
So dekompilieren Sie eine Java-Klassendatei
Java (Klassentyp für Feld verwenden)
Java-Quellcode zum Lesen der Klasse java.lang.Math
Verwendung von Klassenmethoden [Java]
[Java] Verwendung der Math-Klasse
[Java] Zugriffsbeschränkungen für private Felder gelten nicht pro Objekt, sondern pro Klasse
[Java] Wrapper, der die private Methode eines Objekts von außerhalb der Klasse ausführt
Java lernen (0)
Java studieren ―― 3
[Java] -Array
Was ist eine Klasse in der Java-Sprache (3 /?)
[Java] Anmerkung
[Java] Modul