终极父类Object

终极父类——object类:位于包java.lang中

  1. 用于转型等
  • 如果一个类声明时没有指定父类,那么它的父类就是object类
  • object类的主要方法
public String toString();  

public boolean equals(Object obj); 

public final Class getClass();  //返回对象的类型类
> 官方建议:不要重写该方法

protected Object clone() throws CloneNotSupportedException;   
//创建并返回此对象的副本给调用者。

public int hashCode();  //返回对象的哈希码
toString()方法
  • Object类的toString()方法打印对象在内存中的位置。这是一个十六进制字符串
  • System.out.println(dog) == String s = dog.toString() + System.out.println(s) //dog是个对象

官方建议:始终考虑在你的类中重写该方法

  1. 重写
  • 一次糟糕的重写
public String toString() {
    String returnString = "{";
    for (int i = 0; i < size; i += 1) {
        returnString += keys[i]; //这条语句不仅将key[i]加到returnString上,并创建一个新的字符串
        returnString += ", ";
    }
    returnString += "}";
    return returnString;
}
  • 改进

使用StringBuilder. 它创建了一个可变的字符串对象,因此您可以继续附加到同一个字符串对象,而不是每次都创建一个新对象。

StringBuilder returnSB = new StringBuilder("{");
        for (int i = 0; i < size - 1; i += 1) {
            returnSB.append(items[i].toString());
            returnSB.append(", ");
        }
        returnSB.append(items[size - 1]);
        returnSB.append("}");
        return returnSB.toString();
equal()方法
  • 比较两个引用变量是否指向同一个对象 ,否则在类中重写equals()方法
  • ==检查两个对象是否实际上是内存中的同一个对象
  1. 重写equals()遵守的规则
  • 反身:x.equals(x)是真的
  • 对称:x.equals(y)为真当且仅当y.equals(x)为真
  • 传递:如果x.equals(y)和y.equals(z)为真,则x.equals(z)为真
  • x.equals(null)必须是假的

会更改两个对象的等价方式,并且Object的实现hashCode()不再有效。因此也必须重写hashCode()

clone()方法(浅拷贝)

对象的类或其超类必须实现了java.lang.Cloneable接口

//实现类
public class Animal implements Cloneable {

    ...
    public Object clone() throws CloneNotSupportedException {
       ...
        //也可以为私有
    }
    ...
}

浅拷贝:当复制引用类型的对象时仅复制其引用,而不是复制对象

深拷贝:当复制引用类型的对象时复制其对象

<think>好的,我需要回答用户关于JavaObject类的默认无参构造函数的使用说明。首先,我要确认用户的问题点:用户想了解Object类默认的无参构造函数的用途和如何正确使用它。根据提供的引用内容,我需要整合相关信息,确保回答准确且符合规范。 首先,引用[1]提到,如果声明的是基本类Object,默认构造函数体是空的。引用[3]指出,当类没有显式构造器时,编译器会插入默认的无参构造器,以便实例化。引用[4]来自Oracle官网,说明所有类至少有一个构造器,如果没有显式声明,编译器会自动提供默认的无参构造器,该构造器会调用父类的无参构造器,对于Object类来说,父类就是它自己,所以调用的是Object的构造器。 接下来,我需要组织这些信息,分点说明Object类默认无参构造函数的特性、使用场景、注意事项以及示例。同时,要确保回答中使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$。不过在这个问题中可能涉及数学公式较少,但如果有相关部分需要注意格式。 另外,用户可能存在的疑问包括:如果Object的构造函数是默认的,如何影响子类?默认构造函数是否可以被覆盖或修改?根据引用[5],子父类成员的构造函数特点,子类构造函数默认会调用父类的无参构造器,而Object作为所有类的根父类,其构造器会被隐式调用。 需要确保回答中引用的内容正确标注,如引用[1]、[3]、[4]等,并在末尾列出参考文献。同时,生成相关问题时要围绕Object类构造函数的相关知识点,比如子类继承、构造函数链、默认行为的变化等。 最后,检查回答是否符合用户要求的格式:结构清晰,分步骤或分点说明,代码示例正确,引用标识自然添加。确保没有使用Markdown格式,使用中文,并且LaTeX语法正确。</think>### Java Object类默认无参构造函数使用说明 #### 1. 默认构造函数的特性 - **自动生成**: 如果类未显式声明任何构造函数,Java编译器会**自动插入默认的无参构造函数**[^4]。对于`Object`类本身,其默认构造函数体为空,不执行任何操作[^1]。 - **隐式调用**: 在创建子类对象时,若子类构造函数未显式调用父类构造函数,会**隐式调用父类的无参构造函数**。由于所有类的终极父类是`Object`,最终会调用`Object`的无参构造函数[^5]。 #### 2. 使用场景 - **直接实例化**: 当通过`new Object()`创建对象时,默认构造函数会被调用。 - **继承体系中的隐式调用**: 子类构造函数未指定`super(...)`时,自动调用父类的无参构造函数,最终传递到`Object`的构造函数。 #### 3. 注意事项 - **显式定义的影响**: 若子类显式定义了构造函数但未调用`super(...)`,编译器会自动添加`super()`调用父类无参构造函数。若父类无无参构造函数,则编译报错[^4]。 - **Object类的特殊性**: 由于`Object`是继承体系的根类,其构造函数**无法被覆盖或修改**,且始终存在默认无参版本。 #### 4. 代码示例 ```java // 示例1:显式调用Object构造函数(实际开发中无需这么做) Object obj = new Object(); // 示例2:子类隐式调用Object构造函数 class ChildClass { public ChildClass() { // 编译器自动插入super() -> 调用Object的无参构造函数 } } ``` #### 5. 相关引用说明 - 默认构造函数的行为遵循Java语言规范,确保对象初始化链的完整性[^3]。 - 若父类缺少无参构造函数,子类必须显式调用其他父类构造函数,否则无法通过编译。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳衣白卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值