1. 程式人生 > >java的Object類理解和介面的定義

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,....{

}