我們先用提幹兩個修飾詞中的任意一個建立一個類
package components.javaTest.day4_20200910; /** * Question004: * java面試題0004-在一個類上是否可以用abstract和final同時加以修飾? */ public final class AbstractAndFinal { }
package components.javaTest.day4_20200910; /** * Question004: * java面試題0004-在一個類上是否可以用abstract和final同時加以修飾? */ public abstract class AbstractAndFinal { }
可見任意一個修飾符單獨修飾時,沒問題
接下來我們嘗試兩個組合使用
package components.javaTest.day4_20200910; /** * Question004: * java面試題0004-在一個類上是否可以用abstract和final同時加以修飾? */ public final abstract class AbstractAndFinal { }
or
package components.javaTest.day4_20200910; /** * Question004: * java面試題0004-在一個類上是否可以用abstract和final同時加以修飾? */ public abstract final class AbstractAndFinal { }
可以看到編譯器提示報錯了——》illegal combination of modifiers:'final' and 'abstract'
所以改題答案為:
否(一個類上不可以同時用abstract和final進行修飾)
WHY?
至於為什麼不能同時加以修飾?在使用一個東西之前,我們如果有時間和精力的話,最好先了解下這個東西到底是拿來幹哈子的。所以,我們先來看看這兩個修飾詞各自的含義及其用法。
abstract
含義:
抽象的
用法:
可以作用於: 1.類 2.方法
1.作用在類時:
表示抽象類,不能被例項化
2.作用在方法時:
表示抽象方法,沒有具體實現
final
含義:
Java中的final關鍵字根據不同的上下文環境,會存在細微的差別(出於設計或者出於開發效率的角度考慮),但它通常代表的意思為:“無法改變的”
用法:
可以作用於: 1.變數 2.方法 3.類
1.作用在變數時有可能表示:
A.編譯時常量,永遠不改變
B.執行時被初始化的值,在初始化之後都不會被改變
2.作用在方法時有可能表示:
A.防止任何繼承類修改它的含義,即鎖定?方法,以免【出於設計的考慮】
父類如果有個final修飾的say()方法,這時,子類就不允許出現重寫的say()方法(如果想方法名不變,可以選擇過載的思路)
B.在java早期實現中,final修飾的方法就是同意編譯器將針對該方法的所有呼叫都轉為內嵌呼叫【出於效率的考慮-至於裡面的道道,還得進一步瞭解,但在這裡我們暫且先大致瞭解其用法】
3.作用在類時表示:
該類無法被繼承
我們可以這麼理解:
abstract主要目的是想讓一個實現類去具體實現,而final最主要是一種約束,不想讓其他人來修改它的實現,兩者相互矛盾。所以不能共存。
非 淡 泊 無 以 明 志
非 寧 靜 無 以 致 遠 !