天天看點

Java類的擴充

1、Object類

Object類:Java中所有類的公共父類,如果一個類未明确地繼承其他類則一定是Object的子類。

Object類的主要方法
方法名稱 類型 描述
public Object() 構造 構造方法
public boolean equals(Object obj) 普通 對象比較
public int hashCode() 普通 取得hash碼
public String toString 普通 對象列印時調用

equals()方法預設比較的是位址,toString()方法預設列印的是對象位址。平常使用這兩種方法時為友善開發會覆寫這兩種方法。

public class ObjectDemo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Demo01 d1=new Demo01();
		System.out.println(d1);
		System.out.println(d1.toString());	//調用Object原有的toString()
		Demo02 d2=new Demo02("張三");
		System.out.println(d2.toString());	//調用被覆寫的toString()
	}

}
class Demo01{}
class Demo02{
	private String name;
	public Demo02(String name) {
		this.setName(name);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String toString() {	//覆寫Object的toString()
		return "姓名是:"+this.getName();
	}
}
//[email protected]
//[email protected]
//姓名是:張三
           

對象在輸出時一定會調用Object類的toString()列印内容,是以可以通過toString()取得對象的資訊。——為取得對象具體的資訊就需調用被自己覆寫的toString()。

2、内部類的擴充

在一個抽象類中可以定義多個抽象類或接口,在一個接口中也可以定義多個接口或抽象類。

在抽象類中可以定義多個内部抽象類,在接口中可以定義多個内部接口。

public class InnerExtDemo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A.B b=new X().new Y();	//執行個體化内部接口對象
		b.printB();	//調用内部接口的抽象方法
	}

}
abstract class A{
	abstract void printA();
	interface B{	//定義内部接口
		abstract void printB();
	}
}
class X extends A{
	public void printA() {
		System.out.println("抽象類中的抽象方法");
	}
	class Y implements B{	//定義内部類實習内部接口
		public void printB() {
			System.out.println("接口中的抽象方法");
		}
	}
}
//結果
//接口中的抽象方法
           
差別點 抽象類 接口
定義 包含一個抽象方法的類 包含全局常量和抽象方法的集合
組成 構造方法、抽象方法、普通方法、常量、變量 抽象方法、全局常量
使用 子類繼承抽象類(extends) 子類實作接口(implements)
特殊點或關系 抽象類可以包含或實作多個接口 接口可以包含多個抽象類但不能繼承抽象類,但能繼承多個接口
常見設計模式 模闆設計 工廠設計、代理設計
對象 都通過對象的多态産生執行個體化對象
局限 抽象類有單繼承的局限 接口無此局限
實際 作為一個模闆 作為一個标準或表示一種能力
選擇 如果抽象類和接口都能使用,優先選擇接口(避免單繼承的局限)

3、匿名内部類

定義:沒有具體名稱的類。

作用:可利用内部類建立不具有名稱的對象,并利用它通路類中的成員。

常見的應用:避免接口實作類使用次數太少而去單獨定義一個類。

public class NoInnerClassDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new X().fun2();
	}

}
interface A{
	abstract void print();
}

class X{
	public void fun1(A a) {	//友善接受接口的執行個體化對象
		a.print();			//調用接口方法
	}
	//1、執行個體化接口對象
	//new A(){}	//接口本身不能直接執行個體化,使用{}方法在執行個體化後實作接口抽象方法
	//2、實作接口方法
	//new A(){
	//    **********
	//  }
	public void fun2() {	
		this.fun1(new A() {	//匿名内部類
			public void print() {	//實作接口的方法
				System.out.println("實作接口抽象方法");
			}
		});
	}
}
//結果:
//實作接口抽象方法