本文討論抽象類和最終類的區別。在討論差異之前,讓我們首先了解它們各自的含義。
最終類:使用“Final”關鍵字聲明的類稱為最終類。 Final關鍵字用於最終確定該類中使用的類、方法和變量的實現。使用最終類的主要目的是防止該類被繼承(即,如果一個類被標記為最終類,則任何其他類都不能從該最終類繼承任何屬性或方法。如果最終類被擴展,Java 會給出編譯時錯誤。以下是如何聲明最終類的示例。但是,由於要繼承此最終類,因此會出現編譯時錯誤。
Java
// Java program to demonstrate the
// Final class
final class Super {
private int data = 100;
}
public class Sub extends Super {
public static void main(String args[])
{
}
}
抽象類:使用 “abstract” 關鍵字聲明的類稱為抽象類。抽象類背後的主要思想是實現以下概念抽象。抽象類可以同時具有抽象方法(沒有主體的方法)和具體方法(有主體的常規方法)。但是,普通類(非抽象類)不能有抽象方法。以下是如何聲明抽象類的示例。
Java
// Java program to demonstrate
// an abstract class
// Abstract parent class
abstract class Book {
// Abstract method without body
public abstract void page();
}
// shayar class extends Book class
public class shayar extends Book {
// Declaring the abstract method
public void page()
{
System.out.println("Geek");
}
// Driver code
public static void main(String args[])
{
Book obj = new shayar();
obj.page();
}
}
上麵的程序給出“Geek”作為輸出。所有抽象方法都應該在子類中重寫以提供實現。然而,從定義來看,final 方法不能被重寫。因此,抽象的最終組合對於方法來說是非法的。而且,對於抽象類,我們需要創建一個子類來提供實現,而對於最終類,我們不能創建子類。因此,最終的抽象組合對於類來說是非法的。因此,最終類不能包含抽象方法,而抽象類可以包含最終方法。下麵是一個示例,演示了抽象類和最終類的組合。
Java
final class A {
public abstract void methodOne();
}
顯然,這個實現是無效的,因為最終類不能有抽象方法。作為final類不能被繼承。
Java
abstract class A {
public final void methodOne() {}
}
但是,抽象類可以有最終方法。這個最終方法被視為具有無法重寫的主體的普通方法。
下表展示了抽象類和最終類之間的區別:
編號 | 抽象類 | 最後一堂課 |
---|---|---|
1. | 使用“abstract”關鍵字。 | 使用“final”關鍵字。 |
2. | 這有助於實現抽象。 | 這有助於限製其他類訪問其屬性和方法。 |
3. | 為了以後使用,應該重寫所有抽象方法 | 由於最終類不能被繼承,因此不會出現重寫概念 |
4. | 有的方法可以實現,有的不能實現 | 所有方法都應該有實現 |
5. | 無法創建不可變對象(事實上,無法創建任何對象) | 可以創建不可變對象(例如 String 類) |
6. | 抽象類方法的函數可以在子類中更改 | Final 類方法應該像其他類一樣使用 |
7. | 可以繼承 | 不可繼承 |
8. | 無法實例化 | 可以實例化 |
9. | 抽象類可能有最終方法。 | Final類沒有抽象方法或final方法。 |
10. | 抽象類有助於實現抽象。 | Final 類可以幫助限製其他類訪問屬性和方法。 |
相關用法
- Java FileDescriptor sync()用法及代碼示例
- Java FileDescriptor valid()用法及代碼示例
- Java FileInputStream available()用法及代碼示例
- Java FileInputStream close()用法及代碼示例
- Java FileInputStream finalize()用法及代碼示例
- Java FileInputStream getChannel()用法及代碼示例
- Java FileInputStream getFD()用法及代碼示例
- Java FileInputStream skip()用法及代碼示例
- Java FileOutputStream close()用法及代碼示例
- Java FileOutputStream finalize()用法及代碼示例
- Java FileOutputStream getChannel()用法及代碼示例
- Java FileOutputStream getFD()用法及代碼示例
- Java FilePermission equals()用法及代碼示例
- Java FilePermission getActions()用法及代碼示例
- Java FilePermission hashCode()用法及代碼示例
- Java FilePermission implies()用法及代碼示例
- Java FilePermission newPermissionCollection()用法及代碼示例
- Java FilterInputStream available()用法及代碼示例
- Java FilterInputStream close()用法及代碼示例
- Java FilterInputStream mark()用法及代碼示例
- Java FilterInputStream markSupported()用法及代碼示例
- Java FilterInputStream reset()用法及代碼示例
- Java FilterInputStream skip()用法及代碼示例
- Java FilterOutputStream close()用法及代碼示例
- Java FilterOutputStream flush()用法及代碼示例
注:本文由純淨天空篩選整理自gauravmoney26大神的英文原創作品 Difference between Final and Abstract in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。