当前位置:网站首页>À propos des objets et des objets

À propos des objets et des objets

2022-01-15 02:41:39 Vers le Haut

À propos deObjectEtObjects

No1Chapitre ObjectCatégorie

1.1Généralités

java.lang.ObjectLa classe estJavaClasse racine en langue,Est le parent de toutes les classes.Toutes les sous - classes de méthodes décrites dans ce document peuvent être utilisées.Lorsque l'objet est instantané,Le parent ultime estObject.

Si une classe ne spécifie pas spécifiquement un parent, La valeur par défaut est héritée deObjectCatégorie.Par exemple:

public class MyClass /*extends Object*/ {
    
  	// ...
}

SelonJDKCode source etObjectClasseAPIDocumentation,ObjectLes méthodes incluses dans la classe sont:11- Oui..Aujourd'hui, nous étudions principalement2- Oui.:

  • public String toString():Renvoie la représentation par chaîne de l'objet.
  • public boolean equals(Object obj):Indique si un autre objet est associé à cet objet“Équivalence”.

1.2 toStringMéthodes

Résumé méthodologique

  • public String toString():Renvoie la représentation par chaîne de l'objet.

toStringLa méthode renvoie la représentation par chaîne de l'objet,En fait, le contenu de la chaîne est le type d'objet+@+Valeur de l'adresse mémoire.

Parce quetoStringLa méthode renvoie une adresse mémoire,Et dans le développement,Il est souvent nécessaire d'obtenir une représentation de chaîne correspondante basée sur les propriétés de l'objet,Il faut donc le réécrire..

Override override

Si vous ne voulez pas utilisertoStringComportement par défaut de la méthode,Vous pouvez l'écraser.

Par exemple, personnalisé PersonCatégorie:

public class Person {
      
    private String name;
    private int age;

    @Override
    public String toString() {
    
        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

    // Omettre le constructeur etGetter Setter
}

InIntelliJ IDEAMoyenne,Peut être cliquéCodeDans le menuGenerate...,Vous pouvez également utiliser des raccourcis clavieralt+insert,Cliquez surtoString()Options.Sélectionnez les variables membres à inclure et déterminez.Comme le montre la figure ci - dessous:

Insérer la description de l'image ici

Conseils: Lorsque nous sortons le nom de l'objet directement en utilisant l'instruction de sortie , En fait, il est appelé par cet objet toString()Méthodes.

1.3 equalsMéthodes

Résumé méthodologique

  • public boolean equals(Object obj):Indique si un autre objet est associé à cet objet“Équivalence”.

Appeler la méthode membreequalsEt spécifiez le paramètre comme autre objet,Pour déterminer si les deux objets sont identiques.Ici.“Même chose.”Il y a deux façons de le faire: par défaut et personnalisé.

Comparaison des adresses par défaut

S'il n'y a pas d'écrasementequalsMéthodes,AlorsObjectPar défaut dans la classe==Comparaison des adresses des objets de l'opérateur,Tant que ce n'est pas le même objet,Le résultat doit êtrefalse.

Comparaison du contenu de l'objet

Si vous voulez comparer le contenu d'un objet ,C'est - à - dire que toutes les variables des membres ou une partie de celles - ci spécifiées sont les mêmes pour déterminer que les deux objets sont les mêmes,Vous pouvez écraser la réécritureequalsMéthodes.Par exemple:

import java.util.Objects;

public class Person {
    	
	private String name;
	private int age;
	
    @Override
    public boolean equals(Object o) {
    
        // Si l'adresse de l'objet est la même,Est considéré comme identique
        if (this == o)
            return true;
        // Si le paramètre est vide,Ou les informations de type sont différentes,Est considéré comme différent
        if (o == null || getClass() != o.getClass())
            return false;
        // Conversion au type actuel
        Person person = (Person) o;
        // Exiger l'égalité des types de base,Et donne le type de référence àjava.util.ObjectsClasseequalsMéthode statique pour obtenir les résultats
        return age == person.age && Objects.equals(name, person.name);
    }
}

Ce code tient pleinement compte du fait que l'objet est vide 、 Problèmes de cohérence des types, etc. , Mais le contenu de la méthode n'est pas unique .La plupartIDE Peut être généré automatiquement equals Contenu du Code de la méthode .InIntelliJ IDEAMoyenne,Peut être utiliséCodeDans le menuGenerate…Options,Vous pouvez également utiliser des raccourcis clavieralt+insert,Et choisirequals() and hashCode()Génération automatique de code.Comme le montre la figure ci - dessous:

Insérer la description de l'image ici

Insérer la description de l'image ici
Insérer la description de l'image ici

tips:Object Autres méthodes dans la classe ,Études futures.

CAS:

/** 
*  Dans le système étudiant ,Ajouter des informations sur les étudiants, Et exiger que le même nom et le même âge soient la même personne , Ajout non autorisé au système . 
*   Définir une méthode d'ajout , Les élèves peuvent être ajoutés au contenant .
*/
package com.igeek.javase.code.ch06.object;

import java.util.Objects;

/** * @Version 1 * @Description TODO * @Athuor zhangquan * @Date 2021/9/8 9:45 */
public class Student extends Object {
    

    private String name;
    private int age;

    public Student(String name, int age) {
    
        this.name = name;
        this.age = age;
    }

    public Student() {
    
    }

    public String getName() {
    
        return name;
    }

    public void setName(String name) {
    
        this.name = name;
    }

    public int getAge() {
    
        return age;
    }

    public void setAge(int age) {
    
        this.age = age;
    }


    //RéécritureequalsMéthodes
    @Override
    public boolean equals(Object o) {
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    //RéécriturehashCodeMéthodes
    @Override
    public int hashCode() {
    
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
    
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

package com.igeek.javase.code.ch06.object;

import java.util.Arrays;
import java.util.Objects;

/** * @Version 1 * @Description TODO * @Athuor zhangquan * @Date 2021/9/8 13:32 */
public class StudentTest {
    

    private Student[] stus=new Student[3];
    private int index;

    public Student[] getStus() {
    
        return stus;
    }

    /** *  Ajouter des informations sur l'étudiant à ce conteneur , Quand le contenant contient des informations sur l'étudiant (name,ageC'est pareil.) Impossible d'ajouter  * @param stu  Objets étudiants à ajouter  * @return  Ajouter un résultat réussi  */
    public boolean add(Student stu){
    
        // Déterminer si l'expansion du tableau est nécessaire 
        if(index >= stus.length){
    
            stus=Arrays.copyOf(stus,stus.length*3/2+1);
        }
        // Seuls les étudiants différents peuvent être stockés 
        boolean flag=true;
        for (int i = 0; i < index; i++) {
    
            /*if(stus[i] != null){ if(stus[i].equals(stu)){ flag = false; } }*/
            // C'est comme ça. ,Objects  La méthode dans la classe est sûre contre un pointeur vide (Tolérez les pointeurs vides)
            if(Objects.equals(stus[i],stu)){
    
                flag = false;
            }
        }
        if(flag) {
    
            stus[index++]=stu;
            System.out.println("Ajouter"+stu.getName()+"Succès");
        }
        return flag;
    }

    @Override
    public String toString() {
    
        return "StudentTest{" +
                "stus=" + Arrays.toString(stus) +
                ", index=" + index +
                '}';
    }

    public static void main(String[] args) {
    
        StudentTest ST = new StudentTest();

        Student stu1 = new Student("Zhang San",18);
        Student stu2 = new Student("Zhang San",19);
        Student stu3 = new Student("Zhang San",18);
        Student stu5 = new Student("Li - si.",18);
        Student stu6 = new Student("Wang Wu",18);
        Student stu4 = stu1;

        //Ajouter un étudiant
        ST.add(stu1);
        ST.add(stu2);
        ST.add(stu3);
        ST.add(stu4);
        ST.add(stu5);
        ST.add(stu6);

        System.out.println(ST.toString());
    }
}

1.4 cloneMéthodes

Code source:

@HotSpotIntrinsicCandidateprotected 
native Object clone() throws CloneNotSupportedException;

Cloner un objet avec les mêmes informations que ce type ,Adresse différente,Même valeur de propriété!

Clonage "Copie"

  • Si un objet d'une classe doit utiliser clone(), La classe actuelle doit être mise en œuvre Cloneable Interface ou lancer une exception CloneNotSupportedException

  • ObjectMoyenneclone()- Oui.protectedAutorité, Seuls les clone()

  • Si vous voulez appeler clone(), Doit être réécrit clone(),Doit être réaliséCloneableInterface

  • Clonage superficiel Et Clonage profond

CAS

public class CloneDemo1 implements Cloneable{
    

    //Lors de la réécriture de la méthode,La permission deprotectedAutorité --> publicAutorité
    // La valeur de retour peut être retournée par  Object --> CloneDemo1  Évitez d'utiliser après chaque virage fort 
    @Override
    protected CloneDemo1 clone() throws CloneNotSupportedException {
    
        return (CloneDemo1)(super.clone());
    }
}
public class CloneDemo2 /*extends Object*/ implements Cloneable{
    
    public static void main(String[] args) throws CloneNotSupportedException {
     
        CloneDemo2 demo1 = new CloneDemo2();
        //Object.clone()Retour à unObjectObjet de la classe
        CloneDemo2 demo2 = (CloneDemo2)demo1.clone();
        System.out.println("demo1 = "+demo1);
        System.out.println("demo2 = "+demo2);
        System.out.println("---------------------------");
        CloneDemo1 demo3 = new CloneDemo1();
        CloneDemo1 demo4 = demo3.clone();
        System.out.println("demo3 = "+demo3);
        System.out.println("demo4 = "+demo4);
        System.out.println("---------------------------");
        //Object obj1 = new Object();
        //Object obj2 = obj1.clone();
    }
}

Clonage superficiel Et Clonage profond

Se produit lorsqu'une relation d'association existe entre une classe et une classe

Les Clones peu profonds ne clonent que des classes externes , La classe associée a été clonée avec l'adresse

Le clonage profond est le clonage d'une classe associée aussi

Insérer la description de l'image ici

Insérer la description de l'image ici

package com.igeek.javase.ch06.object.clone;
public class Person implements Cloneable{
    

    private String name;
    private String gender;
    private int age;

    //Association individuelle
    private Phone phone;

    //Outrepasser la méthode de clonage Ctrl+O
    @Override
    protected Person clone() throws CloneNotSupportedException {
    
        //Clonage superficiel
        //Person person = (Person)super.clone();
        //return person;

        //Clonage profond
        Person person = (Person)super.clone();
        Phone phone = this.phone.clone();
        person.setPhone(phone);
        return person;
    }

    public Person() {
    
    }

    public Person(String name, String gender, int age, Phone phone) {
    
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.phone = phone;
    }

    /** * Accès * @return name */
    public String getName() {
    
        return name;
    }

    /** * Paramètres * @param name */
    public void setName(String name) {
    
        this.name = name;
    }

    /** * Accès * @return gender */
    public String getGender() {
    
        return gender;
    }

    /** * Paramètres * @param gender */
    public void setGender(String gender) {
    
        this.gender = gender;
    }

    /** * Accès * @return age */
    public int getAge() {
    
        return age;
    }

    /** * Paramètres * @param age */
    public void setAge(int age) {
    
        this.age = age;
    }

    /** * Accès * @return phone */
    public Phone getPhone() {
    
        return phone;
    }

    /** * Paramètres * @param phone */
    public void setPhone(Phone phone) {
    
        this.phone = phone;
    }

    public String toString() {
    
        return "Person{name = " + name + ", gender = " + gender + ", age = " + age + ", phone = " + phone + "}";
    }
}


package com.igeek.javase.ch06.object.clone;
public class Phone implements Cloneable {
    

    private String label;
    private double price;

    //Outrepasser la méthode de clonage
    @Override
    protected Phone clone() throws CloneNotSupportedException {
    
        return (Phone)super.clone();
    }

    public Phone() {
    
    }

    public Phone(String label, double price) {
    
        this.label = label;
        this.price = price;
    }

    /** * Accès * @return label */
    public String getLabel() {
    
        return label;
    }

    /** * Paramètres * @param label */
    public void setLabel(String label) {
    
        this.label = label;
    }

    /** * Accès * @return price */
    public double getPrice() {
    
        return price;
    }

    /** * Paramètres * @param price */
    public void setPrice(double price) {
    
        this.price = price;
    }

    public String toString() {
    
        return "Phone{label = " + label + ", price = " + price + "}";
    }
}



package com.igeek.javase.ch06.object.clone;
public class PersonTest {
    

    public static void main(String[] args) throws CloneNotSupportedException {
    
        Phone phone = new Phone("Huawei",6000.0);
        Person p1 = new Person("Zhang San","Hommes",20, phone);
        Person p2 = p1.clone();

        System.out.println("---------------Clonage superficiel----------------");
        System.out.println("----------Après clonage,Avant modification--------");
        System.out.println("p1 = "+p1);  //Zhang San Hommes 20 Huawei 6000.0
        System.out.println("p2 = "+p2);  //Zhang San Hommes 20 Huawei 6000.0

        System.out.println("----------Après clonage,Après modification--------");
        p1.setGender("Femme");
        p1.getPhone().setLabel("Pommes");
        System.out.println("p1 = "+p1);  //Zhang San Femme 20 Pommes 6000.0
        System.out.println("p2 = "+p2);  //Zhang San Hommes 20 Pommes 6000.0

        System.out.println("---------------Clonage profond----------------");
        Phone phone2 = new Phone("Huawei",6000.0);
        Person p3 = new Person("Zhang San","Hommes",20, phone2);
        Person p4 = p3.clone();
        System.out.println("----------Après clonage,Avant modification--------");
        System.out.println("p3 = "+p3);  //Zhang San Hommes 20 Huawei 6000.0
        System.out.println("p4 = "+p4);  //Zhang San Hommes 20 Huawei 6000.0

        System.out.println("----------Après clonage,Après modification--------");
        p3.setGender("Femme");
        p3.getPhone().setLabel("Pommes");
        System.out.println("p3 = "+p3);  //Zhang San Femme 20 Pommes 6000.0
        System.out.println("p4 = "+p4);  //Zhang San Hommes 20 Huawei 6000.0
    }

}


No2Chapitre ObjectsCatégorie

Objects La classe est une classe d'outils d'objets , Les méthodes qu'il contient sont utilisées pour manipuler des objets .

2.1 equalsMéthodes

Tout à l'heureIDEARéécriture automatiqueequalsDans le Code,C'est bon.java.util.ObjectsCatégorie, Qu'est - ce que cette classe? ?

InJDK7UnObjectsClasse d'outils,Il fournit quelques méthodes pour manipuler les objets,Il se compose de quelques méthodes pratiques statiques,Ces méthodes sont:null-save(Un pointeur vide est sûr)Ounull-tolerant(Tolérant les pointeurs nuls),Utilisé pour calculer les objetshashcode、Renvoie la représentation par chaîne de l'objet、Comparer deux objets.

En comparant deux objets,ObjectDeequalsLa méthode lance facilement une exception de pointeur vide,EtObjectsDans la classeequalsLa méthode optimise le problème.La méthode est la suivante::

  • public static boolean equals(Object a, Object b):Déterminer si les deux objets sont égaux.

On peut vérifier le code source ,Apprends.:

public static boolean equals(Object a, Object b) {
      
    return (a == b) || (a != null && a.equals(b));  


2.2 isNull

static boolean isNull(Object obj) Déterminer si l'objet estnull,Si ouinullRetourtrue.

Student s1 = null;
Student s2 = new Student("Cai xukun", 22);

// static boolean isNull(Object obj) Déterminer si l'objet estnull,Si ouinullRetourtrue
System.out.println(Objects.isNull(s1)); // true
System.out.println(Objects.isNull(s2)); // false

No3Chapitre:Supplément equalsMéthodes ethashCodeMéthodes

Code source:

 @HotSpotIntrinsicCandidate
    public native int hashCode();

ps : nativeLes mots clés sont: java Signaux d'interaction de la langue et d'autres langues , C'est - à - dire que la fonction est implémentée dans d'autres langues

hashCode()Est un algorithme,Selonhash Les valeurs seront les mêmes hash Les éléments qui valent la peine d'être divisés en une zone , Seau de hachage similaire à l'image ci - dessous ,

Quand deux objetsequals(Object Non dépassé par une sous - classe ) Même résultat , Ils doivent avoir le même hachage ,MaishashMême valeur,equals

Pas nécessairement la même, Peut être un élément différent dans un seau

Dans le développement, nous réécrivons souvent equals()Méthodes, Je suggère de le réécrire ici aussi. hashCode()Méthodes

Référence spécifique:

(PS: L'algorithme de hachage est conçu pour améliorer l'efficacité de la recherche )

Insérer la description de l'image ici

版权声明
本文为[Vers le Haut]所创,转载请带上原文链接,感谢
https://chowdera.com/2022/01/202201080601056301.html

随机推荐