在开始学习使用class关键字定义类时,就应用到了继承原理,因为在Java中,所有的类都是直接或间接继承了java.lang.Object类。Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类。
当创建一个类时,总是在继承,除非某个类已经指定要从其他类继承,否则它就是从java.lang.Object类继承而来的,可见java每个类都源于java.lang.Object类,如String、Integer等类都是继承于Object类;除此之外自定义的类也都继承于Object类。由于所有类都是Object类子类,所以在定义类时,省略了extends Object关键字。
在Object类中主要包括clone()、finalize()、equals()、toString()等方法,其中常用的两个方法为equals()、toString()方法。由于所有的类都是Object类子类,所以任何类都可以重写Object类中的方法。
注意:Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法被定义为final类型。
下面详细讲述Object类中的几个重要方法。
1.getClass()方法
此方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。
语法如下:
getClass().getName();
2.toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写此方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString方法。
package jicheng;
public class ObjectInstance {
public String toString() { // 重写toString()方法
return "在"+getClass().getName()+"类中重写toString()方法";
}
public static void main(String[] args) {
System.out.println(new ObjectInstance()); // 打印本类对象
}
}
运行结果为:
在本示例中重写父类Object的toString()方法,在子类的toString()方法中使用Object类中的getClass()方法获取当前的类名,定义一段输出字符串,当用户打印ObjectInstance类对象时,将自动调用toString()方法。
3.equals()方法
以前的博客曾讲过equals()方法,当时是比较s双等于运算符与equals()方法,说明==比较的是两个对象的引用是否相等,而equals()方法比较的是两个对象的实际内容。
class V{
}
public class OverWriteEquals {
public static void main(String[] args) {
String s1="123";
String s2="123"; // 实例化两个对象,内容相同
System.out.println(s1.contentEquals(s2));
V v1=new V(); // 实例化两个V类对象
V v2=new V();
System.out.println(v1.equals(v2));
}
}
运行结果为:true
false
在本实例的结果中可以看出,在自定义的类中使用equals()方法进行比较时,将返回false,因为equals()方法的默认实现是使用“ == ”运算符比较两个对象的引用地址,而不是比较对象的内容,需要在自定义类中重写equals()方法。
- 再谈toString
关于Object类中的toString方法:返回Java对象的字符串表示形式
在现实的开发过程中,Object里的toString方法已经不够用了
toString方法需要被重写
原本是这样实现的:
public String toString() {
return getClass().getName()+"@"+Integer.toHexString(hashcode());
}
Object类中的toString方法返回,类名@java对象的内存地址经过哈希算法得出的int类型值在转换为16进制
public class Test01{
public static void main(String[] args) {
//创建Object类对象
Object o1=new Object();
String oStr=o1.toString();
System.out.println(oStr);//运行结果java.lang.Object@15db9742
//创建Person类对象
Person p1=new Person("liyade",20);
String pStr=p1.toString();
System.out.println(pStr);//运行结果Person@6d06d69c
}
}
class Person{
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
}
重写toString方法:
public class Test01{
public static void main(String[] args) {
//创建Object类对象
Object o1=new Object();
String oStr=o1.toString();
System.out.println(oStr);
//创建Person类对象
Person p1=new Person("liyade",20);
String pStr=p1.toString();
System.out.println(pStr);
}
}
class Person{
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
//重写toString方法
//根据项目需求
public String toString() {
return "Person[name="+name+",age="+age+"]";
}
}
运行结果:
java.lang.Object@15db9742
Person[name=liyade,age=20]