簡體   English   中英

抽象類和具有抽象所有方法的類有什么區別?

[英]What is the difference between an abstract class and a class that has all its methods abstract?

我不知道什么是一個抽象類,具有其所有的方法抽象類之間在Java中的區別? 我的意思是, 抽象類只是一個類,其方法自動變為抽象

絕對不。 實際上,一個類可以是抽象的,沒有任何方法是抽象的,盡管這是相對罕見的(參見下面Mark的評論中的一個例子)。 另一方面,如果一個類有任何抽象方法,那么它必須被聲明為abstract。

一般來說,抽象類的目的是為骨架提供一些非抽象行為,但其他位仍由子類填充。 例如,這可以與模板方法模式一起使用。

任何包含一個或多個抽象方法的類也必須聲明為abstract。 要聲明類抽象,只需在類聲明開頭的class關鍵字前面使用abstract關鍵字。 可以沒有抽象類的對象。 也就是說,不能使用new運算符直接實例化抽象類。 這樣的對象沒用,因為抽象類沒有完全定義。 此外,您不能聲明抽象構造函數或抽象靜態方法。 抽象類的任何子類都必須實現超類中的所有抽象方法,或者本身聲明為抽象方法。

抽象類和接口之間的唯一區別是抽象類可以繼承而接口不能,因此接口沒有任何構造函數與抽象類相反。

每當你在類中創建一個抽象方法時,你就會在類名之前明確提到abstract關鍵字,就像這樣

public abstract class Test {

abstract void show();

}

以下是Java中與Abstract相關的要點

- >抽象類是無法實例化的類之一。

- >如果你想從子類(其他人)實現任何方法,那么抽象方法可以在這個意義上使用。

- >抽象類是不完整的,子類必須聲明缺失的片段才能成為具體類(其對象可以被實例化的類),否則這些子類也成為抽象類。

- >你可以通過“抽象類”實現抽象,這是OOP的主要支柱。 抽象隱藏了對象的無關細節。

- > IS A關系的抽象用法(繼承)。

- >抽象用於實現多態行為(OOP的另一個主要支柱)

- >抽象類不應該是私有的,不包含私有方法。

- >擴展單個抽象類不是多個,因為Java是單個支持的繼承

- >抽象類必須包含1個或多個抽象方法

- >如果任何類包含抽象方法,那么它應該顯式聲明抽象類,即使它包含具體方法。

- >構造函數和靜態方法不能聲明為抽象,因為構造函數不是繼承的。

- >如果子類沒有實現超類的抽象方法,那么它也變成了抽象類。

- >嘗試實例化抽象類的對象是編譯錯誤。

- >抽象超類變量可以保存子具體對象的引用。

在其聲明中包含abstract關鍵字的稱為抽象類

  • 抽象類可能包含也可能不包含抽象方法,即帶有out的方法(public void get();)
  • 但是,如果一個類至少有一個抽象方法,那么該類必須被聲明為abstract。
  • 如果一個類被聲明為abstract,則無法實例化它。
  • 要使用抽象類,必須從另一個類繼承它,為其中的抽象方法提供實現。
  • 如果繼承了一個抽象類,則必須為其中的所有抽象方法提供實現。

如果您不想為所有抽象方法提供實現,那么有一個適配器類概念 :示例:

abstract class A{
    public void m1();
    public void m2();
    public void m3();
    }

class B extends A{
    public void m1(){}
    public void m2(){}
    public void m3(){}
    }


class C extends B{
    public void m2(){
       System.out.println("Hello m2");
       }
    public static void main(String args){
     C obj=new C();
    C.m2();
    }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM