4. Object의 공통 방법은 무엇입니까?(Object 클래스의 11가지 방법에 대한 소스 계층 이해)
8175 단어 java 기초
( )
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(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는 기다리는 시간을 지정할 수 있습니다. 기본값이라면 알림이 올 때까지 기다릴 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 네트워크 프로그래밍의 UDP 서버 및 클라이언트 프로그램서버: 클라이언트: UDP: 클라이언트를 열어 데이터를 받을 때까지 기다린 다음 서버를 열어 데이터를 보냅니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.