導(dǎo)語
俗話說得好:萬物皆對象。既然這樣楚殿,你為什么沒有對象呢撮慨。
主要內(nèi)容
- Object類的作用
- Object類的常用方法
- Object類接收引用數(shù)據(jù)類型
具體內(nèi)容
現(xiàn)在有對象、數(shù)組、接口砌溺,那么這么多數(shù)據(jù)怎么能夠進行統(tǒng)一呢?于是就有了Object類的設(shè)計规伐。
Object類的基本定義
Object類是所有類的父類,也就是說任何一個類的定義的時候如果沒有明確的繼承一個父類的話喊式,那么它就是Object的子類萧朝,也就是說以下兩種類的定義的最終效果是完全相同的。
class Book {
}
class Book extends Object {
}
在整個Java里面類的繼承關(guān)系一直存在(除了Object類之外)检柬。
既然Object是所有類的父類,那么最大的一個好處就在于:利用Object類可以接收全部類的對象何址,因為向上自動轉(zhuǎn)型。
范例:利用Object類來接收對象
class Book extends Object {}
public class TestDemo {
public static void main(String args[]){
Object objA = new Book(); // 向上轉(zhuǎn)型
Object objB = "hello"; // 向上轉(zhuǎn)型
Book b = (Book) objA;
String s = (String) objB;
}
}
既然這樣原押,如果在不確定參數(shù)類型的時候偎血,使用Object類型應(yīng)該是最好的選擇。
問題:為什么在Object類里要定義一個無參構(gòu)造方法呢颇玷?
既然Object類是所有類的父類 ,那么所有類的對象實例化的時候谒亦,了類構(gòu)造方法一定要默認調(diào)用父類的無參構(gòu)造空郊。
從嚴格意義上來講(一般不遵守),任何一個簡單Java類都應(yīng)該覆寫Object類中的如下三個方法:
- 取得對象信息:public String toString()脾还。
- 對象比較:public boolean equals(Object obj)。
- 取得對象HASH碼:public hashCode()入愧。
取得對象信息:toString()
如果說現(xiàn)在是一個String類對象,直接輸出這個對象可以取得字符串的怔蚌,但是如果是一個自定義的對象旁赊,那么發(fā)現(xiàn)就會出現(xiàn)一個對象編碼。
范例:觀察代碼
class Book extends Object {}
public class TestDemo{
public static void main(String args[]) {
Book b = new Book();
String s = "Hello";
System.out.println(b);
System.out.println(b.toString());
System.out.println(s);
}
}
輸出結(jié)果:
Book@659e0bfd
Book@659e0bfd
Hello
發(fā)現(xiàn)現(xiàn)在如果直接輸出對象與調(diào)用toString()方法后輸出對象的功能是完全一樣的籍胯。
在進行對象輸出的時候离福,輸出操作會自動調(diào)用對象中的toString()方法,將對象變?yōu)樽址笤佥敵鲅J情況下Object類中的toString()為了適應(yīng)所有對象的輸出,所以只輸出了對象的編碼绿聘。
如果現(xiàn)在有需要次舌,也可以自己根據(jù)實際情況來覆寫此方法。
范例:覆寫toString()方法
class Book {
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public String toString() {
return "書名:" + this.title + "價格:" + this.price;
}
}
public class TestDemo {
public static void main(String args[]){
Book b = new Book("Java開發(fā)", 79.8);
System.out.println(b);
System.out.println(b.toString());
}
}
輸出結(jié)果:
書名:Java開發(fā)價格:79.8
書名:Java開發(fā)價格:79.8
直接輸出對象就調(diào)用了toString()挪圾,等于輸出對象的時候代碼又節(jié)約了国拇。
對象比較:equals();
對象比較在很多的開發(fā)中都是一定要使用到的核心概念。
范例:覆寫equals()方法
class Book {
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Book)) { // 如果不是本類實例返回false
return false;
}
Book book = (Book) obj;
if (this.title.equals(book.title)
&& this.price == book.price) {
return true;
}
return false;
}
public String toString() {
return "書名:" + this.title + "價格:" + this.price;
}
}
public class TestDemo {
public static void main(String args[]){
Book b1 = new Book("Java開發(fā)", 79.8);
Book b2 = new Book("Java開發(fā)", 79.8);
System.out.println(b1.equals(b2));
System.out.println(b1.equals("Hello"));
}
}
輸出結(jié)果:
true
false
對象的比較操作寫出以上的代碼應(yīng)該就算是完整了也殖。
Object類可以接收一切引用數(shù)據(jù)類型
Object類是所有類的父類务热,所以O(shè)bject類的對象可以接收所有類的對象,可是除了類的對象之外崎岂,Object類連數(shù)組和接口對象也都可以接收。
范例:接收數(shù)組數(shù)據(jù)
public class TestDemo {
public static void main(String args[]) {
Object obj = new int [] {1, 2, 3}; // 向上轉(zhuǎn)型
System.out.println(obj);
if (obj instanceof int[]) {
int data [] = (int[]) obj;
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
}
}
}
輸出結(jié)果:
[I@659e0bfd
1
2
3
除了數(shù)組外绩卤,接口也同樣可以。
范例:接收接口對象
interface A {
public void fun();
}
class B implements A {
public void fun() {
System.out.println("Hello World !");
}
}
public class TestDemo {
public static void main(String args[]) {
A a = new B(); // 接口對象
Object obj = a; // 接收接口對象
A t = (A) obj;
t.fun();
}
}
輸出結(jié)果:
Hello World !
整個程序的參數(shù)就統(tǒng)一在Object類型上何暇。
總結(jié)
- Object類對象可以接收一切的數(shù)據(jù)類型(引用數(shù)據(jù)類型)凛驮,包括數(shù)組和接口,解決數(shù)據(jù)統(tǒng)一問題宏胯。
- toString()在對象直接輸出時調(diào)用本姥,equals()在對象比較時調(diào)用。