1. 为什么说Java中的所有类都is-a Object
在Java中,所有类都是Object类的子类。这是因为Object是Java类层次结构的根类。每个Java类在没有显式指定父类时,默认继承自Object。这意味着每个Java对象都具有Object类的方法,如toString()、equals()和hashCode()等。因此,可以说所有类都“是一个”Object,这为Java提供了统一的对象处理机制。
2. Object的toString方法
在JDK文档中,Object类的toString()方法的定义如下:
public String toString()
用途:
toString()方法用于返回对象的字符串表示。默认实现返回的是对象的类名和对象的哈希码,格式为类名@哈希码。开发者通常会重写此方法,以提供更有意义的信息,方便调试和记录。
Eclipse查看代码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
代码用途分析:
这段代码通过调用getClass().getName()获取类名,并通过hashCode()获取对象的哈希码的十六进制表示,形成对象的默认字符串描述。虽然这个表示不是很直观,但它确保了每个对象都有一个基本的字符串表示。
3. Object的equals方法
在Eclipse中查看Object的equals方法的代码,定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
用途:
equals方法用于比较两个对象是否相等。默认实现比较的是对象的引用,即是否指向同一个对象。开发者通常会重写此方法,以根据对象的内容进行相等性比较。
修饰符分析:
equals方法被public修饰,意味着它可以被任何其他类调用。
何时覆盖equals方法:
当需要基于对象的属性进行比较时(例如,比较两个Person对象的姓名和年龄),就需要覆盖equals方法。
结合String类的equals方法:
在String类中,equals方法被重写为:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i]) {
return false;
}
i++;
}return true; }
}
return false;
}
4. 如果在子类中想要复用父类的代码,要怎么办?
在子类中,可以通过以下方式复用父类的代码:
使用super关键字: 可以在子类的构造方法中调用父类的构造方法。
直接调用父类的方法: 可以在子类中直接调用父类的公共或保护方法。
例如:
class Parent {
void display() {
System.out.println("Parent class method");
}
}class Child extends Parent {
void show() {
super.display(); // 调用父类的方法
}
}
5. 可选: 继承是复用代码的唯一方式吗?
不,继承并不是复用代码的唯一方式。除了继承,还有其他方法可以实现代码复用:
组合(Composition): 通过在一个类中包含另一个类的实例来复用其功能。例如,可以在一个类中使用另一个类的对象作为其成员变量。
接口(Interfaces): 通过实现接口,类可以复用接口定义的方法签名和行为。
工具类: 可以将通用方法封装在工具类中,其他类可以直接调用这些静态方法。