4. Object의 공통 방법은 무엇입니까?(Object 클래스의 11가지 방법에 대한 소스 계층 이해)

8175 단어 java 기초
우선 jdk8 버전의 Object 클래스의 원본 코드를 보십시오:
(       )
package java.lang;
/**
 * **Class {@code Object} is the root of the class hierarchy.
 * Every class has {@code Object} as a superclass. All objects,
 * including arrays, implement the methods of this class**
 *                ,             
 */
public class Object {
   //      ,    C(C++) DLL    ,    JNI  
    private static native void registerNatives();
    static {
    //             
        registerNatives();
    }


    /**
     * Returns the runtime class of this {@code Object}. 
     //      
     */
    public final native Class> getClass();


   /**
     * Returns a hash code value for the object. 
     //         int hashCode 
     */
    public native int hashCode();


    /**
     * Indicates whether some other object is "equal to" this one.
     //            
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }


    /**
     * Creates and returns a copy of this object.  The precise meaning
     * of "copy" may depend on the class of the object. 
     *          
     */
    protected native Object clone() throws CloneNotSupportedException;


    /**
     * Returns a string representation of the object. 
     *            
     */
    public String toString() {

      return getClass().getName() + "@" +   Integer.toHexString(hashCode());
    }


    /**
     * Wakes up a single thread that is waiting on this object's
     *      
     */
    public final native void notify();


    /**
     * Wakes up all threads that are waiting on this object's monitor. 
     *       
     */
    public final native void notifyAll();

    /**
     * Causes the current thread to wait until either another thread invokes the
     * {@link java.lang.Object#notify()} method or the
     * {@link java.lang.Object#notifyAll()} method for this object, or a
     * specified amount of time has elapsed
     */
    public final native void wait(long timeout) throws InterruptedException;


    /**
     * Causes the current thread to wait until another thread invokes the
     * {@link java.lang.Object#notify()} method or the
     * {@link java.lang.Object#notifyAll()} method for this object, or
     * some other thread interrupts the current thread, or a certain
     * amount of real time has elapsed.
     *             notify()     notifyAll()   ,
     *               ,             ,        
     */
    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);
    }


    /**
     * Causes the current thread to wait until another thread invokes the
     * {@link java.lang.Object#notify()} method or the
     * {@link java.lang.Object#notifyAll()} method for this object.
     * In other words, this method behaves exactly as if it simply
     * performs the call {@code wait(0)}
     */
    public final void wait() throws InterruptedException {
        wait(0);
    }

    /**
     * Called by the garbage collector on an object when garbage collection
     * determines that there are no more references to the object.
     * A subclass overrides the {@code finalize} method to dispose of
     * system resources or to perform other cleanup.
     *                      ,              
     */
    protected void finalize() throws Throwable { }
}

다음은 각 방법에 대한 이해를 설명한다.
1.hashcode() public native int hashCode(); hashCode의 일반적인 협정은 다음과 같다.
  • 자바 응용 프로그램이 실행되는 동안 같은 대상에 대해hashCode 방법을 여러 번 호출할 때 같은 정수를 일치하게 되돌려야 한다. 전제는 대상을 equals와 비교할 때 사용한 정보가 수정되지 않았다는 것이다.한 응용 프로그램의 한 번 실행에서 같은 응용 프로그램의 다른 실행까지 이 정수는 일치할 필요가 없다.
  • 만약에 equals(Object) 방법에 따라 두 대상이 같다면 이 두 대상 중의 모든 대상에 대한 호출hashCode 방법은 반드시 같은 정수 결과를 생성해야 한다.
  • 만약에 equals(java.lang.Object) 방법에 따라 두 대상이 같지 않다면 이 두 대상 중 어느 한 대상에서hashCode 방법을 사용하면 반드시 다른 정수 결과를 생성하지 않아도 된다.그러나 프로그래머는 서로 다른 대상을 위해 서로 다른 정수를 생성하면 해시표의 성능을 향상시킬 수 있다는 것을 깨달아야 한다.

  • 2.equals()
    public boolean equals(Object obj) {         return (this == obj); } equals 방법은 전편 블로그에서 상세하게 설명했으니 여기서 더 이상 서술하지 않겠습니다.
    3.getclass()
    public final native Class> getClass();
    먼저 getclass에 대한 JDK API 문서의 설명을 살펴보겠습니다.Object의 운행 시류.되돌아갔어Class 대상은 표시된 클래스이다static synchronized 방법으로 잠긴 대상.
    이 종류의 방법은 주의사항final 형식이기 때문에 다시 쓸 수 없습니다. getclass () 방법을 호출할 때 얻을 수 있는 것은 모두 Object 아래에 있으며, 실행할 때의 대상을 되돌려줍니다. 실행할 때의 대상을 어떻게 되돌려주는지는 jvm가 하는 일입니다.
    아래에 코드를 붙여서 상세한 해석을 진행하다
    package com.zgq.test;
    
    import java.util.Date;
    
    import com.zgq.dao.UserDao;
    import com.zgq.dao.UserDaoimpl;
    import com.zgq.vo.User;
    
    public class Test extends Date{
        public void test(){
        	System.out.println(super.getClass().getName());
        }
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
         new Test().test();
         }
    
    }
    출력:class com.zgq.test.Test;
    현재 런타임 클래스가 Test이므로 반환된 객체는 그의 상위 클래스가 아닙니다.
    4.clone() 
      protected native Object clone() throws CloneNotSupportedException;
    JDK API 문서 쌍의 설명: 이 객체의 사본을 만들고 반환합니다.'던전'의 정확한 의미는 대상의 클래스에 의존할 수 있다.
    여기에 clone에 대한 간단한 설명일 뿐이고 뒤에 있는 블로그는 얕은 복제, 깊은 복제에 관한 글을 쓸 수 있다.그리고 자바에서 왜 이 방법의 장점을 제공해야 하는지에 대해 상세한 설명을 드리겠습니다.
    5.tostring()
     public String toString() {         return getClass().getName() + "@"+ Integer.toHexString(hashCode());     }
    대상의 문자열 표현 형식 (대상명과hashcod 코드) 을 되돌려줍니다. 여기는 말할 것도 없고 다시 쓰는 것을 권장합니다.
    6.finalize()
    protected void finalize() throws Throwable { }
    먼저 문서에 대한 설명을 살펴보겠습니다.
    쓰레기 수거기가 이 대상에 대한 더 많은 인용이 존재하지 않는다고 확인되면, 대상의 쓰레기 수거기에서 이 방법을 호출합니다.하위 클래스 리셋 finalize 방법으로 시스템 자원을 설정하거나 다른 지우기를 실행합니다.
    finalize의 일반적인 협정은 JavaTM 가상 머신이 종료되지 않은 어떤 스레드도 이 대상에 접근할 수 없다고 확정되었을 때, 종료하려고 하는 다른 대상이나 클래스의 종료 작업이 특정한 작업을 실행하지 않는 한 이 방법을 호출합니다.finalize 방법은 이 대상이 다른 라인에 다시 사용할 수 있도록 하는 것을 포함하여 모든 조작을 할 수 있습니다.그러나finalize의 주요 목적은 대상을 취소할 수 없이 버리기 전에 지우기 작업을 실행하는 것입니다.예를 들어 입력/출력 연결을 나타내는 대상의finalize 방법은 대상을 영구적으로 버리기 전에 연결을 끊을 수 있도록 현식 I/O 업무를 수행할 수 있다.
    Object 클래스의finalize 방법으로 비특수 작업을 수행합니다.그것은 일반적인 반환만 실행합니다.Object의 하위 클래스는 이 정의를 다시 작성할 수 있습니다.
     protected void finalize() throws Throwable { } }
    총괄적으로 말하자면, 어떤 대상이 자바 가상기에서 회수될 때 이 방법을 실행하고, 만약 우리가 이 대상이 회수될 때, 예를 들어 이 대상을 다른 라인에 다시 사용할 수 있도록 하려면, 이 방법을 다시 써야 한다.
    7.notify(),notifyAll(),wait()
     public final native void notify();
    
    public final native void notifyAll();
    
     public final native void wait(long timeout) throws InterruptedException;
    
    public final void wait() throws InterruptedException {
            wait(0);
        }
    
     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 > 0) {
                timeout++;
            }
    
            wait(timeout);
        }

    이 세 가지 방법은 바로 라인을 위한 것이다. 라인의 안전을 실현하려면synchronized가 있고, 이 세 가지 방법은 라인의 동기화를 위해 준비한 것이다.
    우선 저희가 라인의 동기화와 라인의 상호 배척을 알아보도록 하겠습니다.
    스레드 동기화: 바로 보조를 조율하는 것이다. 한 임무, 여러 스레드가 완성되고 스레드의 집행은 선후 순서가 있다. 이것을 스레드 동기화라고 한다.
    스레드 상호 배척: A스레드가 a자원을 호출할 때 B스레드는 a자원을 호출할 수 없습니다. A스레드가 이 자원을 호출한 후에 B스레드가 자원 a를 호출할 수 있습니다. 이를 스레드 상호 배척이라고 합니다.
    wait (): 대상이 이 방법을 호출하면, 대상을 가진 프로세스가 대상의 컨트롤러를 넘겨주고 대기 상태가 됩니다
    notify (): 대상이 이 방법을 호출하면 대상 컨트롤러를 기다리고 있는 라인이 계속 실행될 수 있음을 무작위로 알립니다
    notifyAll (): 대상이 이 방법을 호출하면 대상 컨트롤러를 기다리는 모든 라인이 계속 실행될 수 있음을 알립니다
    또한wait는 기다리는 시간을 지정할 수 있습니다. 기본값이라면 알림이 올 때까지 기다릴 수 있습니다.

    좋은 웹페이지 즐겨찾기