关于Java基类Object

本文深入解析Java的基础类Object,探讨其核心方法如equals、toString及线程同步相关方法的内部实现,并介绍了本地方法的使用。

 java.lang.Object,Object是Java所有类的祖先类(父类)

1.首先看object源码 JDK1.7(oracle)

public class Object {
//本地方法,C/C++在DLL中实现,通过JNI调用
private static native void registerNatives();
//类初始化调用此方法
static {
registerNatives();
}
//返回此Object的运行时类(每个类的Class类对象)
public final native Class<?> getClass();
//获得该对象的hash值
public native int hashCode();
//对比两对象的内存地址,如果不重写,equals方法比较的是对象地址
public boolean equals(Object obj) {
return (this == obj);
}
//本地clone方法,用于对象的赋值
protected native Object clone() throws CloneNotSupportedException;
//返回对象的的字符串表示,默认是:类名+@+hash值
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());

//notify()/notifyAll()/wait()以及wait两个重载方法都是线程同步相关方法
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 {}



可见object中拥有native,hashCode,euqals,clone,toString,wait,notify,notifyAll,finalize这几个方法,其中常用的方法有

equals,toString,以及线程中常常调用的wait,notify,notyfiAll方法。

另外:

源码中并没有Object的构造方法,但是,同样的,编译器在编译期间会给Object(事实上,所有的Java类,只要类中没有

构造方法,编译器都会默认的给一个空构造方法,若已有构造方法,则不会添加)一个默认的空的构造方法

public Object(){}

带有native修饰的都是本地方法,所谓的本地方法是不通过Java语言实现的方法,但可以通过JNI,像调用Java方法一样调用

这些方法。详细的可以搜索查看JNI。 这个方法的作用是对Object以下几个本地方法(hashCode/clone/notify等)进行注册

(可以理解为,这个方法是告诉JVM这几个本地方法的实现映射),每一个有本地方法的都会有这个方法,但其内容不一样

(因为注册的方法不一样嘛)。 
<think>嗯,用户想了解如何在Java中创建基类与子类的继承关系,需要一个示例和继承语法的解释。首先,我得回忆一下Java继承的基本规则。Java是单继承的,也就是说一个子类只能继承一个父类,这点和多继承的语言比如Python不同,需要特别注意。 然后,用户提到了基类和子类,也就是父类和子类的关系。根据引用[3],继承允许子类获得父类的属性和方法。语法方面,引用[1]和[4]提到使用extends关键字,比如class Child extends Parent。不过引用[4]提到的是多继承的语法,但Java不支持多继承,只能通过接口实现,这点需要澄清,避免用户混淆。 接下来,构造方法的处理。当父类有带参数的构造方法时,子类必须显式调用super,并传递相应参数,如引用[2]中的例子。如果父类有无参构造,子类可以不写super,但如果有参数就必须调用。这点很重要,否则会编译错误。 用户可能需要一个具体的例子,最好包括父类和子类的定义,展示属性和方法的继承,以及构造方法的调用。比如,基类Animal有name属性和eat()方法,子类Dog继承并添加bark()方法。同时,在子类构造方法中使用super(name)来初始化父类的属性。 还要注意访问权限,父类的成员变量如果是private的话,子类不能直接访问,需要通过getter/setter方法。所以在示例中,可能需要将父类的属性设为protected,或者在示例中使用public,以便子类直接使用。 另外,是否需要覆盖父类的方法?比如在子类中重写eat()方法,但可能用户只需要基本示例,所以暂时可以不涉及方法重写,保持简单。 最后,总结继承的步骤:定义基类,使用extends创建子类,处理构造方法,添加子类特有方法。同时指出Java单继承的限制,以及super关键字的作用。 检查是否有遗漏,比如是否要提到Object类是所有类的父类?可能对用户来说暂时不需要,保持示例简洁。确保代语法正确,比如Java的类定义、构造方法的结构,super调用的位置必须在子类构造方法的第一行。 现在把这些整理成步骤,用中文清晰解释,并附上代示例,确保符合用户的要求。</think>### Java基类与子类继承关系实现步骤 #### 一、继承语法规则 1. 使用`extends`关键字建立继承关系 2. 子类只能继承**一个**直接父类(单继承)[^3] 3. 父类构造方法调用必须通过`super()`实现[^2] #### 二、实现步骤 1. **定义基类**(父类) ```java // 基类(父类) public class Animal { protected String name; // 受保护属性,子类可访问 // 父类构造方法 public Animal(String name) { this.name = name; System.out.println("执行父类构造方法"); } public void eat() { System.out.println(name + "正在进食"); } } ``` 2. **创建子类** ```java // 子类 public class Dog extends Animal { // 继承语法 private String breed; // 子类特有属性 // 子类构造方法必须调用父类构造 public Dog(String name, String breed) { super(name); // 必须放在构造方法第一行[^2] this.breed = breed; System.out.println("执行子类构造方法"); } // 子类扩展方法 public void bark() { System.out.println(name + "(品种:" + breed + ")在汪汪叫"); } } ``` 3. **使用示例** ```java public class Main { public static void main(String[] args) { Dog myDog = new Dog("小黑", "哈士奇"); myDog.eat(); // 调用继承自父类的方法 myDog.bark(); // 调用子类特有方法 /* 输出结果: 执行父类构造方法 执行子类构造方法 小黑正在进食 小黑(品种:哈士奇)在汪汪叫 */ } } ``` #### 三、关键点解析 1. `super(name)`:强制要求当父类没有无参构造时,必须显式调用父类构造方法 2. `protected`修饰符:使父类成员在子类中可见,但对外部类不可见 3. 方法继承:子类自动获得父类的`public/protected`方法 4. 构造顺序:先执行父类构造,再执行子类构造 #### 四、继承示意图 ``` Animal(基类) ↑ 继承 Dog(子类) ``` 子类包含: - 父类的name属性和eat()方法 - 子类新增的breed属性和bark()方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值