1. 程式人生 > >java的抽象方法為什麼不能是static、final、private?

java的抽象方法為什麼不能是static、final、private?

1、java的抽象方法為什麼不能用static修飾?類抽象方法?

 

  如上程式碼,在抽象類中定義static屬性是沒有問題的,但是定義抽象方法時是不能定義為靜態(static)的,否則編譯器會報錯:The abstract method geta in type abstractTest can only set a visibility modifier, one of public or protected

  我們只定義靜態static方法完全OK,因為靜態方法是屬於類的,所以靜態方法必須滿足給類呼叫,如果通過類無法呼叫,那麼這種靜態方法肯定是不對的。為了達到這一要求,static方法就必須有方法體,即已經實現了,也就不是抽象方法了。所以靜態(static)方法不能是抽象方法,即abstract不能與static同時修飾方法。即沒有類抽象方法。

  如果abstract和static一起修飾已經實現的方法呢?

 

  編譯時會報錯:Abstract methods do not specify a body

  即只要有abstract修飾方法,則必須定義為抽象方法的格式,否則編譯報錯。其次,在main方法中呼叫靜態方法編譯器沒有報錯,但是執行時會報錯:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:

The abstract method out in type abstractTest can only set a visibility modifier, one of public or protected

Abstract methods do not specify a body

 

at firstChap.abstractTest.out(abstractTest.java:6)

at firstChap.abstractTest.main(abstractTest.java:10)

2、abstract不能和final一起出現

  abstract修飾的類需要被子類繼承,abstract修飾的方法需要子類重寫,但是final修飾的類不能被繼承,final修飾的方法也不能被子類重寫。

3、abstract不能和private同時出現

  因為abstract修飾的方法必須通過子類重寫才有效,而private修飾的方法對子類不可見,即父類中如果存在private abstract void out();而子類中有private void out(){},則它們是兩個不同的方法,子類中的out方法不是對父類的重寫,而是屬於子類獨有的方法。

 

 報錯:The abstract method out in type abstractTest can only set a visibility modifier, one of public or protected