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