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("實作接口抽象方法");
}
});
}
}
//結果:
//實作接口抽象方法