1.Object的基本定义
Object类是所有类的父类,也就是说任何一个类在定义的时候如果没有明确的继承一个父类的话,那么它就是Object类的子类,也就是说以下两种类定义的最终效果是一样的
class Book{} | class Book extends Obejct{} |
在整个Java里面类的继承关系一直都存在(除了Object类)。
既然Object类是所有类的父类,那么最大的一个好处久在于可以利用Object类接收全部类的对象(因为可以自动向上转型)。
范例:利用Object类来接收对象
class Book extends Object{}
public class Test1 {
public static void main(String[] args) {
Object obja=new Book();
Object objb="Hello";
Book b=(Book)obja;
String c=(String)objb;
}
}
因此在不确定参数类型的时候,使用Object类型应该是一个很好的选择。
Q:为什么在Object类里面定义一个无参构造方法呢?
A:因为Object类是所有类的父类,那么所有类对象实例化的时候,子类构造方法一定要默认调用父类的无参构造。
从严格意义上讲(一般不遵守),任何一个简单Java类都应该复写Object类中的如下三个方法:
取得对象信息:public String toString()
对象比较:public boolean equals(Object obj)
取得对象HASH码:public int hashCode()
2.取得对象信息:toString()
如果说现在是一个String类对象,直接输出整个对象可以取得字符串的内容,如果是一个自定义类的对象,那么直接输出就会出现一个对象编码。
范例:观察代码
class Book {}
public class Test1 {
public static void main(String[] args) {
Book obja=new Book();
String c="Hello";
System.out.println(c);
System.out.println(obja);
}
}
上述代码结果为:Hello Book@70dea4e
当增加一行“System.out.println(obja.toString());”时此代码结果仍为:Book@70dea4e
发现现在如果直接输出对象与调用toString()方法后输出对象的功能是完全一样的。
在进行对象输出的时候,输出操作会自动调用对象中的toString方法将对象变为字符串后再输出,而默认情况下Object类中的toString()为了适应于所有对象的输出,所以只输出了对象的编码
如果有需要我们也可以自己根据实际情况来复写toString()方法。
范例:复写toString()方法
class Book {
private String title;
private double price;
Book(String title,double price){
this.price=price;
this.title=title;
}
public String toString() {
return "书名:"+this.title+"价格:"+this.price;
}
}
public class Test1 {
public static void main(String[] args) {
Book book=new Book("Java开发", 69.9);
System.out.println(book);
}
}
其输出结果为:书名:Java开发 价格:69.9 直接输出对象就调用了toString()方法
3.对象比较:equals()
范例:实现对象比较
class Book {
private String title;
private double price;
Book(String title,double price){
this.price=price;
this.title=title;
}
public boolean equals(Object obj) {
if (this==obj) { //地址相同
return true;
}
if(obj==null) {
return false;
}
if(!(obj instanceof Book)) {//不是本类对象
return false;
}
Book book=(Book)obj;//向下转型
if(this.title.equals(book.title)
&&this.price==book.price) {
return true;
}
return false;
}
}
public class Test1 {
public static void main(String[] args) {
Book book1=new Book("Java开发", 69.9);
Book book2=book1;
System.out.println(book1.equals(7777)); //false
System.out.println(book1.equals("Hellol")); //false
System.out.println(book1.equals(book2)); //true
}
}
4.Object类可以接收一切引用数据类型
Object类是所有类的父类,所以Object类的对象可以接收所有类类型的对象。可是除了类的对象之外,Object连数组和接口对象也都可以接收。
范例;接收数组数据
public class Test1 {
public static void main(String[] args) {
Object a= new int[] {1,2,3,4};
System.out.println(a); //[I@70dea4e
int[]b =(int[])a;//向下转型
for(int i=0;i<b.length;i++) {
System.out.println(b[i]);
}
}
}
除了数组外,接口也同样可以。
范例:Object类接收接口对象
interface A{
public void fun();
}
class B implements A{
public void fun() {
System.out.println("Hello World!");
}
}
public class Test1 {
public static void main(String[] args) {
/*
* A a=new B();
* A t= a;
* t.fun();
* 与下列代码同等
*/
A a=new B();
Object m=a;
A t=(A) m;
t.fun();
}
}
整个程序的参数就统一在类Object类型上