内容导航:
- 前言
- 1、单继承和父类
- 2、Object类的地位和作用
- 3、Object类的源码
- 4、Object类的方法
前言
亲,Object是一个非常重要的类,不是对象!而且,对象只能是类类型和数组类型的实例。
1、单继承和父类
Java中的类遵循单继承机制,有如下情况:
如果一个类没有直接父类,则隐式继承
Object
类。如果一个类继承了其他父类,就不会直接继承Object。
Object是任何一个类的直接或间接的父类。
因此,任何类都是Object的派生类或者子类。甚至我们随意创建一个类,就可以使用Object类的方法。
示例代码-Parent :
package com.company.project.demo0101;
//隐式继承Object
//public class Parent extends Object
public class Parent {
public Parent() {
}
}
示例代码-Child :
package com.company.project.demo0101;
//显式继承Parent
public class Child extends Parent {
public Child() {
}
}
示例代码-Client :
package com.company.project.demo0101;
public class Client {
public static void main(String[] args) {
// 任何类都是Object的派生类或者子类
Parent parent = new Parent();
System.out.println(parent.equals(null));
System.out.println(parent.getClass());
System.out.println(parent.hashCode());
System.out.println(parent.toString());
Child child = new Child();
System.out.println(child.equals(null));
System.out.println(child.getClass());
System.out.println(child.hashCode());
System.out.println(child.toString());
}
}
运行结果:
false
class com.company.project.demo0101.Parent
2018699554
com.company.project.demo0101.Parent@7852e922
false
class com.company.project.demo0101.Child
1311053135
com.company.project.demo0101.Child@4e25154f
2、Object类的地位和作用
Object
类,在java.lang
包下,位于类层次结构树的顶部,是类层次结构的根类。每个类都使用 Object 作为超类。所有对象,包括数组,都实现了Object
类的方法。因此,每个类都是Object
类的直接或间接后代。
示例代码:
package com.company.project.demo0102;
public class Client {
public static void main(String[] args) {
// 数组也是Object的子类
int[] array = new int[0];
System.out.println(array.equals(null));
System.out.println(array.getClass());
System.out.println(array.hashCode());
System.out.println(array.toString());
}
}
运行结果:
false
class [I
2018699554
[I@7852e922
注意:
我们使用或编写的每个类都继承了Object
的实例方法。一般情况下,不需要直接使用这些方法,但是,如果要用,那么就需要覆盖它们。
3、Object类的源码
在JDK安装根目录下找到并解压缩src.zip
文件,定位到src\java\lang
目录,使用记事本打开Object.java
文件可查看其源码。
官方源码:
package java.lang;
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 > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable {
}
}
4、Object类的方法
Object类中总共定义了11个方法,本章节讨论的从Object继承的方法有六个:
protected Object clone()
创建并返回此对象的一个副本。boolean equals(Object obj)
判断其他某个对象是否与此对象“相等”。protected void finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 一个子类覆盖finalize方法来处理系统资源或执行其他清理。Class<?> getClass()
返回此 Object 的运行时类。int hashCode()
返回该对象的哈希码值。String toString()
返回该对象的字符串表示。
Object类的notify、notifyAll和wait方法都在同步程序中独立运行的线程的活动中起作用,这将在后面的课程中讨论,这里不做介绍。有五个方法:
void notify()
唤醒在此对象监视器上等待的单个线程。void notifyAll()
唤醒在此对象监视器上等待的所有线程。
void wait()
导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。换句话说,这个方法的行为与它简单地执行调用wait(0)完全一样。void wait(long timeout)
导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或者经过指定的时间量。void wait(long timeout, int nanos)
导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或其他一些线程中断当前线程,或已经过了一定时间。
示例代码:
package com.company.project.demo0104;
//Object类在java.lang包中,不用显式import
import java.lang.Object;
public class Client {
public static void main(String[] args) {
// 创建Object对象
Object object = new Object();
// Object类的常用方法
System.out.println(object.equals(null));
System.out.println(object.getClass());
System.out.println(object.hashCode());
System.out.println(object.toString());
// object.notify();
// object.notifyAll();
// object.wait();
// object.wait(1000L);
// object.wait(100L, 20);
}
}
运行结果:
false
class java.lang.Object
2018699554
java.lang.Object@7852e922
持续更新,欢迎留言提议!
码字很累,多点赞多赞赏!