Java中抽象類和接口的使用及區(qū)別分析
一、 抽象類
1、概念
在面向?qū)ο蟮母拍钪?,所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
舉個例子:

1.這里Animal類是動物類,每個動物都有自己的叫法,但這里Animal不是一個具體的動物,里面的bark()方法無法具體實現(xiàn)。
2.Dog是狗類屬于動物,與Animal類是繼承關(guān)系,狗是一種具體的動物,所以里面的bark()方法可以被具體實現(xiàn)。
3.Cat是貓類屬于動物,與Animal類是繼承關(guān)系,貓是一種具體的動物,所以里面的bark()方法可以被具體實現(xiàn)。
4.因此,這里的Animal類可以設(shè)計為抽象類。
2、抽象類語法
在Java中,一個類如果被 abstract 修飾稱為抽象類,抽象類中被 abstract 修飾的方法稱為抽象方法,抽象方法不用給出具體的實現(xiàn)體。抽象類也是類,內(nèi)部可以包含普通方法和屬性,甚至構(gòu)造方法。
舉個例子:
//抽象類
public abstract class Animal {
public int age;
abstract public void eat(); //抽象方法
public Animal(int a) {
this.age = a;
}
}3、抽象類的特性
3.1抽象類不能直接實例化對象
Animal抽象類
public abstract class Animal {
public int age;
abstract public void eat(); //抽象方法
public Animal(int a) {
this.age = a;
}
}Dog類繼承Animal抽象類
public class Dog extends Animal{
public void eat() {
System.out.println("汪汪叫...");
}
public void sleep(){
System.out.println("小狗正在睡覺....");
}
public Dog(int age){
super(age);
}
}Test測試類
public class Test {
public static void main(String[] args) {
Animal animal = new Animal(); //error
}
}
這里實例化Animal抽象類,編譯器報錯。
3.2抽象方法不能是private
public abstract class Animal {
public int age;
abstract private void bark(); //error,抽象方法不能是私有的
abstract public void eat(); //抽象方法
}
3.3抽象方法不能被final和static修飾,因為抽象方法要被子類重寫
public abstract class Animal {
public int age;
abstract final public void eat(); //error
abstract public static void bark();//error
}3.4抽象類必須被繼承,并且繼承后子類要重寫父類中的抽象方法,否則子類也是抽象類,必須要使用 abstract 修飾
Animal抽象類
public abstract class Animal {
public int age;
abstract public void eat(); //抽象方法
public Animal(int a) {
this.age = a;
}
}Dog類繼承Animal抽象類
public class Dog extends Animal{
public void eat() {
System.out.println("汪汪叫...");
}
public void sleep(){
System.out.println("小狗正在睡覺....");
}
public Dog(int age){
super(age);
}
}這里Dog類繼承了Animal抽象類,并且Dog類重寫了Animal抽象類中的eat()抽象方法。
3.5抽象類中不一定包含抽象方法,但是有抽象方法的類一定是抽象類
public abstract class Animal {
public int age;
public Animal(int a) {
this.age = a;
}
}
這里Animal是抽象類,但里面沒有包含抽象方法,是可以正常編譯的。
public class Dog extends Animal{ //error
abstract public void sleep(){
System.out.println("小狗正在睡覺....");
}
public void eat() {
System.out.println("汪汪叫...");
}
public Dog(int age){
super(age);
}
}這里Dog類不是抽象類,如果里面寫了抽象方法,則編譯器會報錯。
3.6抽象類中可以有構(gòu)造方法,供子類創(chuàng)建對象時,初始化父類的成員變量
這里上面的代碼中已經(jīng)體現(xiàn)到了。
4、 抽象類的作用
使用抽象類的場景就如上面的代碼, 實際工作不應(yīng)該由父類完成, 而應(yīng)由子類完成. 那么此時如果不小心誤用成父類了, 使用普通類編譯器是不會報錯的. 但是父類是抽象類就會在實例化的時候提示錯誤, 讓我們盡早發(fā)現(xiàn)問題。使用抽象類相當(dāng)于多了一重編譯器的校驗。
二、接口
1、概念
在Java中,接口可以看成是:多個類的公共規(guī)范,是一種引用數(shù)據(jù)類型。
2、接口的語法和使用
1.接口的定義格式與定義類的格式基本相同,將class關(guān)鍵字換成 interface 關(guān)鍵字,就定義了一個接口。
public interface 接口名稱{
//抽象方法
void method();
}
2.接口不能直接使用,必須要有一個"實現(xiàn)類"來"實現(xiàn)"該接口,實現(xiàn)接口中的所有抽象方法。
public class 類名 implements 接口名稱{
}3.注意事項
子類和父類之間是extends 繼承關(guān)系,類與接口之間是 implements 實現(xiàn)關(guān)系。
3、接口的特性
1.接口中的成員變量默認(rèn)是public static final修飾的。
2.接口中的抽象方法,默認(rèn)都是public abstract修飾的。
舉個例子:Ishape接口
public interface IShape {
int c = 20; //成員變量默認(rèn)是public static final 修飾的
void draw(); //默認(rèn)是abstract修飾的
}
3.如果接口當(dāng)中的方法被default或者static修飾,那么可以有具體實現(xiàn)。
public interface IShape {
default void test(){
System.out.println("default.....");
}
static void test1(){
System.out.println("static.....");
}
4.接口不可以進行實例化。
5.類和接口之間可以使用關(guān)鍵字implements實現(xiàn)接口。
舉個例子:
IShape接口
public interface IShape {
void draw(); //默認(rèn)是abstract修飾的
}
Cycle類
public class Cycle implements IShape{
@Override
public void draw() {
System.out.println("畫一個圓圈.....");//必須實現(xiàn)接口當(dāng)中的抽象方法
}
}
6.一個接口對應(yīng)一個字節(jié)碼文件。
7.重寫接口中方法時,不能使用默認(rèn)的訪問權(quán)限。(子類的重寫方法權(quán)限要大于等于父類)
8.接口中不能有靜態(tài)代碼塊和構(gòu)造方法。
9.如果類沒有實現(xiàn)接口中的所有的抽象方法,則類必須設(shè)置為抽象類。
4、一個類實現(xiàn)多個接口
接下來我會通過代碼來闡述一個類實現(xiàn)多個接口
舉個例子
Animal抽象類
public abstract class Animal {
public String name;
public int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
public abstract void eat();
}
IRunning 接口
public interface IRunning {
void run();
}
ISwimming 接口
public interface ISwimming {
void swim();
}
Frog類繼承Animal抽象類并實現(xiàn)了IRunning,ISwimming兩個接口
public class Frog extends Animal implements IRunning,ISwimming{
public Frog(String name, int age) {
super(name, age);
}
public void sleep(){
System.out.println(this.name+"正在睡覺...");
}
@Override
public void eat() {
System.out.println(this.name+"正在吃蟲子...");
}
@Override
public void run() {
System.out.println(this.name+"正在跑步..");
}
@Override
public void swim() {
System.out.println(this.name+"會游泳.....");
}
}Test測試類
public class Test {
public static void swimming(ISwimming iSwimming){
iSwimming.swim();
}
public static void running(IRunning iRunning){
iRunning.run();
}
public static void main(String[] args) {
swimming(new Frog("小蛙",1));
running((new Frog("小綠",2)));
}打印結(jié)果

上述代碼:一個Frog類實現(xiàn)了IRunning,ISwimming兩個接口,從而闡述了一個類可以實現(xiàn)多個接口。
三、抽象類和接口的區(qū)別
抽象類中可以包含普通方法和字段,這樣的包含普通方法和字段可以被子類直接使用,不用重寫。而接口中不能包含普通方法,子類必須重寫所有的抽象方法。
到此這篇關(guān)于Java中抽象類和接口的使用及區(qū)別分析的文章就介紹到這了,更多相關(guān)java抽象類和接口使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Olingo分析和實踐之ODataImpl詳細分析(重要方法詳解)
ODataImpl.java是Apache?Olingo?OData框架的核心工廠類,負(fù)責(zé)創(chuàng)建序列化器、反序列化器和處理器等組件,支持OData?v4.0/v4.01多版本及JSON/XML格式,本文給大家介紹Olingo分析和實踐之ODataImpl詳細分析,感興趣的朋友一起看看吧2025-07-07
Mybatis Plus 大數(shù)據(jù)游標(biāo)分頁的實現(xiàn)
使用MyBatis Plus的游標(biāo)分頁,我們可以輕松應(yīng)對大數(shù)據(jù)量的場景,本文主要介紹了Mybatis Plus 大數(shù)據(jù)游標(biāo)分頁的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-07-07
當(dāng)Transactional遇上synchronized的解決方法分享
前些時間剛好刷到了有關(guān)于“# 【事務(wù)與鎖】當(dāng)Transactional遇上synchronized”這一類的文章,感覺這也是工作中經(jīng)常會遇到的一類問題了。所以就針對這個話題進行了分析并整理了常用的解決方法,希望對大家有所幫助2023-05-05
springboot 多數(shù)據(jù)源的實現(xiàn)(最簡單的整合方式)
這篇文章主要介紹了springboot 多數(shù)據(jù)源的實現(xiàn)(最簡單的整合方式),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Swagger注解-@ApiModel和@ApiModelProperty的用法
這篇文章主要介紹了Swagger注解-@ApiModel和@ApiModelProperty的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Java concurrency之互斥鎖_動力節(jié)點Java學(xué)院整理
本文通過示例代碼給大家介紹了Java concurrency之互斥鎖的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06
SpringBoot雪花算法主鍵ID傳到前端后精度丟失問題的解決
本文主要介紹了SpringBoot雪花算法主鍵ID傳到前端后精度丟失問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

