objectクラスとその一般的な方法:hasCode、getClass、toString、equals、clone

12709 ワード

API
1.API(Application Programming Interface)アプリケーションプログラミングインターフェース2.Java APIはJavaが提供してくれたクラスです.これらのクラスがどのように実現されているかに関心を持つ必要はありません.これらのクラスが3.Objectクラスの概要クラス階層をどのように使用するかを学ぶ必要があります.すべてのクラスが直接または間接的にクラスから継承されます.
hasCodeメソッド
hasCodeはオブジェクトのハッシュ値を返し、異なるオブジェクトのハッシュ値は異なる.オブジェクトの実際のアドレス値ではなく、論理アドレス値として理解できます.int i = obj.hashCode();
public class MyTest {
    public static void main(String[] args) {
      //  JavaAPI Java          ,        
    //  Object          ,              

       // java.lang      ,      
        //  Object   
        Object obj = new Object();
        //  Object      
      //  int hashCode ()           。         ,     。
      //  System.out.println(obj);
        int i = obj.hashCode();
        System.out.println(i);
        Object obj2 = new Object();
        int i1 = obj2.hashCode();
        System.out.println(i1);
    }
}


ObjectクラスのgetClass()メソッド
このObjectのランタイムクラスを返し、そのクラスのバイトコードファイルオブジェクトを取得します.Class>getClass()クラスのバイトコードファイルオブジェクトを返します.
import java.io.ObjectOutputStream;
public class MyTest {
    public static void main(String[] args) {
        //Object         
        Object obj = new Object();
        int i = obj.hashCode(); //             
        //Object.class---->       
         Class aClass = obj.getClass(); //            
        String s = obj.toString(); //               

ケース:
public class MyTest2 {
    public static void main(String[] args) {
        //Object.class           -----JVM   Object.class        。
        Object obj = new Object();
        Class clazz = obj.getClass(); //Object.class---->       。
        Object obj2 = new Object();
        Class aClass = obj2.getClass();
        Object obj3 = new Object();
        Class aClass1 = obj3.getClass();


        System.out.println(obj==obj2); //false
        System.out.println(clazz==aClass);
        System.out.println(aClass==aClass1);

    }
}


ObjectクラスのtoString()メソッド
このオブジェクトのアドレス値を取得する文字列表現形式は、アドレス値であることに注意する.
ケース1:
public class MyTest {
    public static void main(String[] args) {
        Object obj = new Object();
        String s = obj.toString(); //                 
        System.out.println(s);
        Object o = new Object();
        System.out.println(o.toString());


        //public String toString () {
        //    return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
        //}



    }
}


ケース2:
import java.net.SocketTimeoutException;

public class MyTest2 {
    public static void main(String[] args) {
        Student student = new Student();
        int i = student.hashCode();
        System.out.println(i);
        Class extends Student> aClass = student.getClass();
        System.out.println(aClass.getName());
        System.out.println(student.toString());
        System.out.println("--------------------------");
        Student student1 = new Student("  ", 23);
        //System.out.println(student1.getName());
        //System.out.println(student1.getAge());
        student1.show();
        //     ,       ,       toString()  ,          ,         ,          
        System.out.println(student1.toString());
        //               ,      
    }
}

public class Student {

    private String name;
    private int age;

    public Student() {
    }

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

    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;
    }
    public void show(){
        System.out.println(name+"==="+age);
    }

    @Override
    public String toString() {
        return "  :"+this.name+"==="+"  "+this.age;
    }
}


ケース3:
public class MyTest {
    public static void main(String[] args) {
        Teacher teacher = new Teacher("  ", 23);
        System.out.println(teacher);

    }
}

class Teacher{
    private String name;
    private int age;

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

    //      toString()    alt+insert  toStirng()  ,    
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


Objectクラスのequals()メソッド
a:他のオブジェクトがこのオブジェクトと「等しい」かどうかを示します.ソース:
public boolean equals(Object obj) {
    					return (this == obj);
				}

b:デフォルトでは、オブジェクトの参照が同じかどうかが比較されます.c:比較オブジェクトの参照は意味がないため、この方法を書き換えることを一般的に推奨します.一般に、メンバー変数の値がd:==とequals()の違いに等しいかどうかを比較するために使用されます.(面接問題)==2つのオブジェクトのアドレス値が同じかどうかを比較する.equalsは2つの変数値が同じかどうかを比較する.
ケース1:
public class MyTest {
    public static void main(String[] args) {
        Object obj = new Object();
        Object obj2 = new Object();
        // boolean equals (Object obj)               
        System.out.println(obj == obj2);
        boolean b = obj.equals(obj2);

        //public boolean equals (Object obj){
        //    return (this == obj);
        //}
       //System.out.println(b);

        System.out.println("---------------------");
        Student s1 = new Student("  ", 23);
        Student s2 = new Student("  ", 23);
        System.out.println(s1 == s2);//false
        //System.out.println(s1.equals(s2)); //true
        //   ,s1.equals(s2)           ,    ,        ,     ,               ,           。          equals()  ,                    

        boolean b1 = s1.equals(new Teacher());//ClassCastException       
        System.out.println(b1);

        System.out.println("---------------");
        boolean b2 = s1.equals(s1);
        System.out.println(b2);

    }
}

class Student {
    private String name;
    private int age;

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

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

        //                     
        //       obj  Student   。
        //A:
        //        
        //        == ,!= , < , > , <= , >= , instanceof(    )
        //instanceof       ,   ,        
        if (!(obj instanceof Student)) {
            return false;
        }
        //    
        Student stu = (Student) obj;
        //"  "=="  " 0x001==0x002
        // this.name.equals(stu.name)               
        //String extends Object{
        //   //    ,      equals     ,          ,            
        //             equals                  
        // }
        return this.name.equals(stu.name) && this.age == stu.age;
    }
}

class Teacher {

}


ケース2:**Objectクラスのequalsメソッドがデフォルトで比較されているのは、2つのオブジェクトのアドレス値が同じかどうかです.多くのクラスは、この比較メソッドの意味が大きくないと思って書き換えます.自分の比較方法でカスタムクラスを比較します.equalsメソッドを書き換えるのは、2つのオブジェクトのメンバー変数の値が同じかどうか**
public class MyTest {
    public static void main(String[] args) {
       /* Object    equals        ,            ,
             ,             ,    ,            
               ,  equals                    
        */

        System.out.println(new Student("  ", 23).equals(new Student("  ", 23)));

    }
}

import java.util.Objects;

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

    public Student() {
    }

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

    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;
    }

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

    //alt+insert
    @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);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}


Objectクラスのclone()メソッド
clone()のパーミッション修飾子は保護されており、使用時にこのクラスにメソッドを書き換えさせ、このメソッドのパーミッション修飾子をpublicオブジェクトの浅いクローンに変更します.浅いクローンと深いクローンはclone()メソッドを使用して浅いクローン方式を採用しています.
オブジェクトのクローンの詳細:
  • **オブジェクトがcloneメソッドクローンを呼び出す必要がある場合、そのオブジェクトが属するクラスはCloneableインタフェースを実装する必要があります.**
  • Cloneableインタフェースは識別インタフェースにすぎず、方法はありません.
  • オブジェクトの浅いクローンが1つのオブジェクトをクローンする場合、クローンされたオブジェクトの中で別のクラスのオブジェクトが維持されている場合は、別のオブジェクトのアドレスをクローンするだけで、別のオブジェクトもクローンしません.
  • オブジェクトの浅いクローンも構築メソッドに呼び出されません.オブジェクトの深いクローン(後述):O bjectOutputStreamを使用してオブジェクトをファイルに書き込むことを実装し、O bjectInputStreamで
  • を読み込む.
    public class MyTest {
        public static void main(String[] args) throws CloneNotSupportedException {
          //  protected Object clone ()              。
            Dog dog = new Dog();
            System.out.println(dog);
            dog.name="  ";
            dog.age=10;
            System.out.println(dog.name);//  
            System.out.println(dog.age);//10
    
            // dog=new Dog();
            Dog dog1= (Dog) dog.clone();
            System.out.println(dog1);
            System.out.println(dog1.name);//  ,  
            System.out.println(dog1.age); //23 10
            //CloneNotSupportedException        
    
            Dog dog2 = new Dog();
            Dog dog3 = (Dog) dog2.clone();
            System.out.println(dog3.name);
            System.out.println(dog3.age);
    
    
        }
    }
        //      Cloneable   ,    Object.clone()                   。
        //
        //            Cloneable          Object   clone   ,       CloneNotSupportedException   。
    
    //Cloneable            ,       
    class Dog extends Object implements Cloneable{
        String name="  ";
        int age=23;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            //     clone  
            return super.clone();
        }
    }
    
    

    ケース2:1.オブジェクトの浅いクローンが1つのオブジェクトをクローンする場合、クローンされたオブジェクトの中で別のクラスのオブジェクトが維持されている場合は、別のオブジェクトのアドレスをクローンするだけで、別のオブジェクトもクローンしません.
    2.深いクローン:あるオブジェクトをクローンするとき、クローンされたオブジェクトの中で別のクラスのオブジェクトをクローンするときは、このオブジェクトだけでなく、このオブジェクトの中で維持されているオブジェクトをクローンする深いクローン:シーケンス化されたストリームで実現することができ、後でIOストリームを学ぶとき
    import java.io.ObjectOutputStream;
    import java.util.zip.DeflaterOutputStream;
    public class MyTest {
    
        public static void main(String[] args) throws CloneNotSupportedException {
            //       :1.  clone           ,      ,        ,            clone  
            //2.         Cloneable  ,         
    
            //Dog dog = new Dog();
            //dog.name="  ";
            //dog.age=10;
            //Dog dog1 = (Dog) dog.clone();
            //dog1.name="  ";
            //dog1.age=19;
            //System.out.println(dog.name);//
            //System.out.println(dog.age);
            //System.out.println(dog1.name);
            //System.out.println(dog1.age);
            System.out.println("---------------------");
            DogFood dogFood = new DogFood("   ");
            Dog dog = new Dog("  ", 3, dogFood);
            dog.dogFood.name = "  ";
            Dog dog1 = (Dog) dog.clone();
            dog1.dogFood.name = "  ";
    
            System.out.println(dog.dogFood.name);//
            System.out.println(dog1.dogFood.name);//
    
            new Object().hashCode();
    
            //                 ,                    ,                ,    
            //           。
    
            //   :         ,                                   ,                      :           ,    IO     
    
        }
    }
    
    class Dog implements Cloneable {
        public String name;
        public int age;
        public DogFood dogFood;
    
        public Dog() {
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    
        public Dog(String name, int age, DogFood dogFood) {
            this.name = name;
            this.age = age;
            this.dogFood = dogFood;
        }
    }
    
    class DogFood {
        public String name;
    
        public DogFood(String name) {
            this.name = name;
        }
    }