java的Object類理解和介面的定義
一、Object類簡單理解
我們剛開始接觸到java時,最常做的是如何使用class關鍵字定義一個類,在這其中就應用到了繼承的原理,因為所有的類都直接或者間接繼承了java.lang.Object類。Object類是一個很特殊的類,它是所有類的父類,是java類層中的最高層類。當建立一個類時,總是在繼承,除非某個類已經要從其他類繼承,可見java中的每個類都源於java.lang.Object類。
例如String、Integer、Random等等都是繼承於Object類,除此之外,自己定義的類也都是繼承Object類。因為所有的類都是Object類的子類,所有通常會把extends Object關鍵字給省略。
class Son{ //自定義的一個類,名字為Son
//程式碼
}
其實上面的類等價於下面的形式
class Son extends Object{//上下兩中形式等價,其實就是一個類
//程式碼
}
二.Object類的常用方法
在Object類中主要包括了clone()、finalize()、equals()、toString()等方法,其中最常用的兩個方法為equals()和toString()方法。由於所有類都繼承Object類,所以任何類都可以重寫Object類的方法;
注意:Object類中的getClass()、notify()、notifyAll()、wait()等方法不能被重寫,因為這些方法為final型別。
*getclass()方法
getClass()方法是Object類定義的方法,他會返回物件執行時例項的Class例項,然後使用此例項呼叫getName()方法可以得到類的名稱。
語法如下:
getClass().getname();
可以將getclass()方法與toString()方法聯合使用。
*toString()方法
toString()方法的功能是將一個物件返回為字串形式,它會返回一個String例項物件。在實際應用中通常重寫toString()方法,為提供一個特定的輸出模式。當這個類轉換為字串或與字串連線時,將自動呼叫重寫的toString()方法。
在專案中建立一個ObjectTest類,在類中重寫Object類的toString()方法,並在主方法中輸出該類的例項物件。
package Demo;
public class ObjectTest {
public String toString(){
return "在"+getClass().getName()+"類重寫toString()方法";
}
public static void main(String []args){
// ObjectTest obj=new ObjectTest();
// String s=obj.toString();
// System.out.println(s);
System.out.println(new ObjectTest()); //這一句程式碼將此類物件轉換成字串,與上述三行程式碼的執行結果一樣
}
}
輸出效果圖:
在本類的事例中重寫了Object的toString()方法,在子類的toString()方法中使用Object類中的getClass()方法獲取當前執行的類名,定義一段輸出字串,當用戶列印ObjectInstace類物件時,將自動呼叫toString()方法;
*equals()方法
據我所知好友一種比較的方法就是使用“==”運算子,“==”運算子比較的是兩個物件的引用是否相等,而equals()方法比較的是兩個物件的實際內容。
下面我舉一個例項,呼叫equals()方法來判斷兩個物件或者字串是否相等。
public class Equals {//自定義類
}
public class TestEquals {
public static void main(String []args){
String s1="hello"; //例項化兩個物件
String s2="hello";
System.out.println(s1.equals(s2));//使用equals()方法呼叫,比較的是內容,返回true
System.out.println(s1==s2);//兩個變數s1、s2指向的是統一個地址,並沒有new一個新的物件;比較的是地址,返回true
String s3=new String("abc");
String s4="abc";
System.out.println(s3==s4);//此時它們的地址不同返回的是false
Object o1 =new Object();
Object o2 =new Object();
System.out.println(o1.equals(o2));//Object類中的equals方法比較的是兩個物件的引用,返回false
Equals e1 = new Equals();
Equals e2 = new Equals();
System.out.println(e1.equals(e2));//兩個自定義類使用equals()方法進行比較,比較的是地址,返回false
}
}
在上述例項的結果中可以看出,兩個自定義類的物件進行比較,比較的是它們的地址,呼叫equals()方法,返回值是false。要想比較的是內容,必須重寫equals()方法;
三.介面的定義
介面是抽象類的延伸,可以將它看做是純粹的抽象類,介面中的所有方法,都沒有方法體。
介面使用interface關鍵字進行定義,其如法如下所示:
public interface Shape{
public static final int a=3;定義一個常量
public abstract void work();//介面內的方法,public、abstract關鍵字都可以省略
}
注意: ,在藉口中定義的方法必須是public或者abstract形式,其他修飾許可權不被編譯器認可,即使不將方法宣告為public形式,它也是public形式,在介面中定義任何欄位自動是static和final的;
一個類要實現介面可以使用implements關鍵字:
public class Equals implements InterfaceTest{
public void work(){
System.out.println("方法重寫成功");
}
}
可以在繼承一個類的同時還能實現介面:
public class Equals extends Demo implements InterfaceTest{
public void work(){
System.out.println("方法重寫成功");
}
}
也可以定義一個介面繼承另一個介面:
interface in1{
}
interface in2 extends in1{
}
一個類可以實現多個介面:介面與繼承
class 類名 implements 介面1,介面2,....{
}