抽象類、接口、異常、
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");
}
}

至于為什麼是這個結果,我們先不讨論,先來想一下這段代碼具體的執行過程,在執行開始,先要尋找到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.接口
抽象方法的集合,通常用關鍵字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();
}
}