天天看點

javaBasics篇(八)抽象類、接口、

抽象類、接口、異常、

1.instanceof關鍵字

用法:

作用:用來在運作時指出對象是否是特定類的一個執行個體。instanceof通過傳回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個執行個體。

2.static關鍵字

用來修飾方法、變量使其變為靜态方法、靜态變量、靜态代碼塊。而靜态方法在調用的時候可以直接通過類名.方法名調用,不需要進行對象執行個體化,再去調。

靜态變量被所有的對象所共享,在記憶體中隻有一個副本,它當且僅當在類初次加載時會被初始化。而非靜态變量是對象所擁有的,在建立對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

非靜态方法可以在方法體中直接調用靜态方法。

靜态代碼塊隻執行一次,一般用來初始化一些東西。

作用:友善在沒有建立對象的情況下來進行調用(方法/變量)。

//靜态代碼塊
class Person{
    private Date birthDate;
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        Date startDate = Date.valueOf("1946");
        Date endDate = Date.valueOf("1964");
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}


class Person{
    private Date birthDate;
    private static Date startDate,endDate;
    static{
        startDate = Date.valueOf("1946");
        endDate = Date.valueOf("1964");
    }
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}
           
public class Test extends Base{
 
    static{
        System.out.println("test static");
    }
     
    public Test(){
        System.out.println("test constructor");
    }
     
    public static void main(String[] args) {
        new Test();
    }
}
 
class Base{
     
    static{
        System.out.println("base static");
    }
     
    public Base(){
        System.out.println("base constructor");
    }
}
           
javaBasics篇(八)抽象類、接口、

至于為什麼是這個結果,我們先不讨論,先來想一下這段代碼具體的執行過程,在執行開始,先要尋找到main方法,因為main方法是程式的入口,但是在執行main方法之前,必須先加載Test類,而在加載Test類的時候發現Test類繼承自Base類,是以會轉去先加載Base類,在加載Base類的時候,發現有static塊,便執行了static塊。在Base類加載完成之後,便繼續加載Test類,然後發現Test類中也有static塊,便執行static塊。在加載完所需的類之後,便開始執行main方法。在main方法中執行new Test()的時候會先調用父類的構造器,然後再調用自身的構造器。是以,便出現了上面的輸出結果。

3.抽象類(abstract關鍵字)

抽象類:使用關鍵字abstract修飾。

抽象類不能被new執行個體化,隻能靠子類去實作它。

抽象方法:使用關鍵字abstract修飾,光有方法名沒有方法體。

抽象方法必須在抽象類中

4.接口

javaBasics篇(八)抽象類、接口、

抽象方法的集合,通常用關鍵字interface聲明。

接口不能被執行個體化,接口中沒有構造方法,必須要重寫接口中的方法。

接口的實作:類使用關鍵字implements聲明該類實作一個或多個接口(多個時用逗号隔開)。

public class MammalInt implements Animal{
 public void eat(){ 
System.out.println("Mammal eats"); 
}
 public void travel(){ 
System.out.println("Mammal travels"); 
}
 public int noOfLegs(){
 return 0; 
} 

public static void main(String args[]){
 MammalInt m = new MammalInt(); 
  m.eat();
 m.travel();
     }

 }   
           

5.抽象類、接口的差別?

(1)抽象類用abstract關鍵字修飾,接口用關鍵字implements修飾

(2)抽象類中的抽象方法不需要方法體,抽象類中可以有非抽象的方法。接口中的方法沒有具體的實作。必須通過類來實作接口,并且重寫接口方法。

(3)抽象類不能用new運算符來建立對象

(4)相同點:都不可以執行個體化、都可以通過繼承實作其抽象方法

不同點:接口支援多繼承,抽象類不能實作多繼承

接口隻定義抽象規則;抽象類既可以定義抽象規則,還可以提供以實作的成員

接口可用于回調;抽象類不能實作回調

接口隻包含方法、屬性、索引器、事件的簽名,但是不能定義字段和包含實作的方法;抽象類可以定義字段、屬性、包含有實作的方法

接口可以作用于值類型和引用類型;抽象類隻能作用于引用類型

interface Person{
	public static final int num=100;
	public void hairColor();//不能使用{}方法體括号,否則會報錯
	public void bodyLength();
 }
 
public class InterfaceFaceDemo01 implements Person{
/*
 * @see Person#hairColor()
 * 使用接口後,必須将接口中的方法全部覆寫一遍,不然會報錯
 */
	public void hairColor(){
		System.out.println("頭發顔色:紅色");
	}
	@Override
	public void bodyLength() {
		System.out.println("身高:180");
		
	}
	public static void main(String[] args) {
		//要使用接口中的方法,需要執行個體化對象才能調用
		
		/*
		 * 對比之前的筆記,如果不使用接口,又要使用方法,是需要在方法前面添加修飾符static的
		 */
		InterfaceFaceDemo01 iDemo01=new InterfaceFaceDemo01();
		iDemo01.bodyLength();
		iDemo01.hairColor();
	}
 
 
 
}