在开始学习使用class关键字定义类时,就应用到了继承原理,因为在Java中所有的类都直接或间接继承了java.lang.Object类。Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类。用户创建一个类时,除非已经指定要从其他类继承,否则它就是从java.lang.Object类继承而来的。
Java中的每个类都源于java.lang.Object类,如String类、Integer类等都是继承于Object类。除此之外,自定义的类也都继承于Object类。由于所有类都是Object类的子类,所以在定义类时可省略extends Object。
class Anything{} 等价于 class Anything(extends Object{}
//定义类时可以省略extends Object
在Object类中,主要包括clone()、finalize()、equals()、toString()等方法,其中常用的两个方法为equals()和toString()方法。由于所有的类都是Object类的子类,所以任何类都可以重写Object类中的方法。
注意:
Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法被定义为final类型。
下面详细讲述Object类中的几个重要方法。
1.getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。语法如下:
getClass().getname();
可以将getClass()方法与toString()方法联合使用。
2.toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString(方法。
【例1】让学生自我介绍
创建Student类,重写toString()方法,使该类的对象可以自定义输出自己的姓名和年龄。
java
public class Student{
String name;
int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return "我叫"+name +",今年"+age+"岁。";
}
public static void main(String[] args){
Student s1 = new Student("张三",16);
System.out.println(s1);
Student s2 = new Student("李四",19);
System.out.println(s2);
}
}
运行结果如下:
我叫张三,今年16岁。
我叫李四,今年19岁。
3.equals()方法
在Java语言中,有两种比较对象的方式,分别为"=="运算符与equals()方法。两者的区别在于:"=="比较的是两个对象引用内存地址是否相等,而equals()方法比较的是两个对象的实际内容。来看下面的实例。
【例2】根据身份证号判断是否为同一人
为People类创建身份证号和姓名两个属性,重写equals()方法,仅以身份证号作为区分条件。创建n个People对象,用equals()方法和"=="运算符来判断是否存在多个对象代表同一个人。
java
public class People {
int id; //身份证号
String name; //名字
public People(int id,String name){
this.id = id;
this.name = name;
}
public boolean equals(Object obj){ //重写Object类的equals()方法
if(this == obj) //如果参数与本类是同一个对象
return true;
if(obj == null) //如果参数是null
return false;
if(getClass() != obj.getClass()) //如果参数与本类类型不同
return false;
People other = (People) obj; //将参数强转成本类对象
if (id!=other.id) //如果两者的身份证号不相等
return false;
return true;
}
public String toString(){ //重写Object类的toString()方法
return name; //只输出名字
}
public static void main(String[] args){
People p1 = new People(220,"tom");
People p2 = new People(220,"汤姆");
People p3 = new People(330,"张三");
Object o = new Object();
System.out.println(p1+"与"+p2+"是否为同一人?");
System.out.println("equals()方法的结果:"+p1.equals(p2));
System.out.println("==运算符的结果:"+(p1==p2));
System.out.println();
System.out.print(p1+"与"+p3+"是否为同一人?");
System.out.println(p1.equals(p3));
System.out.print(p1+"与"+0+"是否为同一人?");
System.out.println(p1.equals(o));
}
}
运行结果如下:
tom与汤姆是否为同一人?
equals()方法的结果:true
==运算符的结果:false
tom与张三是否为同一人? false
tom与java.lang.Object@48cf768c是否为同一人? false
从这个结果可以看出,"tom"和"汤姆"虽然名字不同,但是两者的身份证号相同,所以equals()方法判断出了这两个对象实际上是同一个,而"=="运算符无法做出有效判断。如果两个对象的身份证号不同,或者两个对象类型都不同,equals()方法就会认为两者不是同一个人。