Objectのすべてのメソッド


public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
    public final native Class<?> getClass();
    public native int hashCode();
    public boolean equals(Object obj) {
        return (this == obj);
    }
    protected native Object clone() throws CloneNotSupportedException;
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    public final native void notify();
    public final native void notifyAll();
    public final native void wait(long timeout) throws InterruptedException;
     public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
    }
    public final void wait() throws InterruptedException {
        wait(0);
    }
    protected void finalize() throws Throwable { }
}

実は多くの时、私たちは1つのクラスがObjectクラスであることを無視して、ソースコードさえ見たことがありませんが、javaシステムの中で重要な役割を果たしています.Objectはすべてのクラスの親です.この言葉でその地位を知ることができ,次にObjectにおける各手法の役割を紹介する.
native void registerNatives()// 

nativeを持つのはjavaローカルメソッドであり,javaの移植性は基本的に彼らの功績である.
 public final native Class<?> getClass();

これは、実行時Objectを返すクラスであり、プログラムが反射によってインスタンスを取得する具体的な例はNumber n=0である. Class c = n.getClass(); 
 public native int hashCode();

ハッシュコード、この役割は一般にHashMapで使用され、1つのオブジェクトがHashMapのkeyである場合、この方法を実装しなければならない.多くの場合、newには同じオブジェクトがたくさんありますが、これらのオブジェクトはHashMapでは上書きされません.親オブジェクトを直接継承するhashCode、equalsなので、もともと等しいオブジェクトは等しくありません.ただし,hashCodeメソッドを自分で実現する際には,異なるオブジェクトが返すintができるだけ同じでないように注意することで,HashMapの効率を向上させることができる.しかし、問題も来て、多くの学生は私がどのように書き直して保証することができることを知っていて、同じ対象はきっと同じで、異なる対象はできるだけ異なると言っていますか?ソースコードの下に秘密はありません.
/*
* String  hashCode
*value   bean   StringBuffer
* char [] value  String  hashCode , 
* 
*/

public int hashCode() {  
    int h = hash;  
    if (h == 0) {  
        int off = offset;  
        char val[] = value;  
        int len = count;  
  
            for (int i = 0; i < len; i++) {  
                h = 31*h + val[off++];  
            }  
            hash = h;  
        }  
        return h;  
    }
    public boolean equals(Object obj) {
        return (this == obj);
    }

この方法はアドレス空間が同じかどうかを専門に比較するすべてのものがnewから出てきた新しいオブジェクトであればアドレス空間は同じではなく,中身が同じであるにもかかわらず同じではないが,このとき我々自身が実現するクラスが同じかどうかを判断するにはequalsを自分で書き直さなければ判断できない.実は私たちがhashCodeを実現したらこの時にこれを使って対比することができますが、hashCodeでは絶対に同じであることは保証できません.正確性が完璧に要求された場合にhashCodeを使うことはできません.では、問題が来ました.この時、私たちはどのように判断すればいいのでしょうか.やはり単純なbean類だけを仮定して、複合類は多くの他の要素が混在していて、功力は完全に制御することができなくて、でたらめを言う勇気がありません.Javaベースのタイプごとに判断してこそ、必ず正しいことを保証することができます.友达がいて、私たちは加算することができますか?このように最後に判断すればいいのではないでしょうか.これは実はhashCodeを実現する原理です.これはできません.絶対的な一致を保証することはできません.なぜですか.君に聞くべきだよ.
  protected native Object clone() throws CloneNotSupportedException;

cloneという方法も無視しやすい方法ですが、この方法は設計モードの中のプロトタイプモードの基礎です.cloneメソッドを使用するときは必ずインタフェースCloneableを継承しなければならないことに注意してください.そうしないと、パッケージが間違っています.多くの学生はこれに理解していません.実は、私もなぜこのメソッドがあれば、何もないインタフェースを継承するのか分かりません.いくつかの資料を検索するとき、このインタフェースはフラグビットとして、ローカルメソッドが実装されるとフラグビットが検出され、これは下位実装の原理問題であると述べた.これは注意点を率直に言います:あのclone方法の使い方は実は2種類あって、1つは浅いコピーで、1つは深いコピーです.両者の違いは何ですか.
浅いコピーはコピーされたオブジェクトの参照ですが、参照とどんなデメリットがありますか?クローンクラス操作が属性を参照すると、元のクラスの属性が変わります.これが浅いコピーのデメリットです.修正を提供しなければ、一定の基礎で浅いコピーの安全を保証できますが、反射では保証できません.このとき、私たちはどうすればいいですか.
深いコピーはすべてのオブジェクトをコピーしますが、javaのcloneメソッドは浅いコピーです.深いコピーを実現するには、自分で実現する必要があります.(時間が足りなければ実現方法を具体的に説明しない)
    public final native void notify();
    public final native void notifyAll();
    public final native void wait(long timeout) throws InterruptedException;
    public final void wait(long timeout, int nanos) throws InterruptedException {
    public final void wait() throws InterruptedException {

上の4つの方法はマルチスレッドの中の基礎で、マルチスレッド設計モードシリーズの文章の中でいくつかの優雅な応用があってあまり説明しません.
 protected void finalize() throws Throwable { }

この方法はごみを回収するときに、まずこの方法を呼び出さなければならず、多くの場合、終わりの仕事をすることができます.多くの子供靴はこの方法を書き直したnewオブジェクトはSyetemを呼び出した.gc()の場合、呼び出されていないことがわかります.私の上の言葉はでたらめを言っているのではないでしょうか.実はそうではありません.主にあなたのnewというオブジェクトに呼び出しがなければ、コンパイラが最適化するときは直接あなたのその言葉をremoveにあげます.何の効果もありませんから、テストするときは必ず引用しなければなりません.そうしないと、コンパイラの階層に直接なくなり、自然に結果が見えません.
最後にまとめます:Objectのすべての方法はすべていくつかの部分で重要な役を演じて、無視するものほど殺し屋を演じやすくて、多くの大企業がこれらの基礎を試験したいのは彼らがいくつかの天井を流したことがあるかもしれないためで、各位の学友がすべて比類なく自分の基礎を重視することを望んでいます.