溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java抽象定義的示例分析

發(fā)布時間:2022-03-05 09:31:05 來源:億速云 閱讀:126 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Java抽象定義的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、概述

在OOP這個概念中,所有的對象都是通過類來描述的;但是并不是所有的類都是用來描述對象的。如果一個類沒有包含足夠的信息來描述一個具體的對象,這樣的類稱為抽象類。

抽象類:(1)抽象類不能實例化對象,如果實例化某個對象,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象(2)可以包含:成員變量、成員方法、構(gòu)造方法等。(3)構(gòu)造方法、類方法(用static修飾的方法)不能聲明為抽象方法

抽象方法:(1)如果一個類包含抽象方法,那么該類一定是抽象類(2)任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類

定義:abstract class 類名

二、示例:農(nóng)民喂動物

Animal:抽象類--------getName()、move()、drink()

Reptile、Mammal:繼承抽象類

蛇、老虎、山羊、兔子:分別繼承Reptile或Mammal

fammer:bringWater()、feedWater(Animal animal)---- 負(fù)責(zé)將水帶到指定的地方,然后動物移動去目的地,喝水

Java抽象定義的示例分析

代碼如下:

package abstractDemo;
 
/**
 * @author lpx
 * @Description TODO
 * @date 2021-04-07
 */
public abstract class Animal {
    abstract String getName();
    abstract void move(String destination);
    abstract void drink();
}
abstract class Reptile extends Animal{
 
}
 
abstract class Mammal extends Animal{
 
}
 
class Tiger extends Mammal{
    private static String name="tiger";
 
    @Override
    String getName() {
        return this.name;
    }
 
    @Override
    void move(String destination) {
        System.out.println("tiger move to "+destination+".");
    }
 
    @Override
    void drink() {
        System.out.println("tiger lower it is head and drink");
    }
}
 
class Goat extends Mammal{
    private static String name="goat";
 
    @Override
    String getName() {
        return this.name;
    }
 
    @Override
    void move(String destination) {
        System.out.println("goat move to "+destination+".");
    }
 
    @Override
    void drink() {
        System.out.println("goat lower it head to drink");
    }
}
 
class Rabbit extends Mammal{
    private static String name="rabbit";
 
    @Override
    String getName() {
        return this.name;
    }
 
    @Override
    void move(String destination) {
        System.out.println("rabbit move to "+destination+".");
    }
 
    @Override
    void drink() {
        System.out.println("rabbit put out it is tongue and drink");
    }
}
 
class Snake extends Reptile{
    private static String name="snake";
 
    @Override
    String getName() {
        return this.name;
    }
 
    @Override
    void move(String destination) {
        System.out.println("snake move to "+destination+".");
    }
 
    @Override
    void drink() {
        System.out.println("snake dived into and drink");
    }
}
 
class Farmer{
    public void bringWater(String destination){
        System.out.println("Farmer bring water to " + destination + ".");
    }
 
    public void feedWater(Animal a){ // polymorphism
        this.bringWater("Feeding Room");
        a.move("Feeding Room");
        a.drink();
    }
 
}
 
class Test{
    public static void main(String[] args) {
        Farmer fm=new Farmer();
        Snake snake=new Snake();
        Goat goat=new Goat();
        Tiger tiger=new Tiger();
        Rabbit rabbit=new Rabbit();
 
        fm.feedWater(snake);
        fm.feedWater(goat);
        fm.feedWater(tiger);
        fm.feedWater(rabbit);
    }
}

執(zhí)行結(jié)果:

Java抽象定義的示例分析

總結(jié):

如果每種動物不是抽象出drink和move方法的話,就無法實現(xiàn)多態(tài)。農(nóng)夫類就需要根據(jù)參數(shù)的不同重載多個feedWater。如果繼續(xù)添加動物那么重載個數(shù)就越來越多。為了方便對比理解,我也按照常規(guī)思維去寫了一下,代碼如下:

package abstractDemo;
 
/**
 * @author lpx
 * @Description TODO
 * @date 2021-04-07
 */
 
class Tiger1{
    private static String name="tiger";
 
    String getName() {
        return this.name;
    }
 
    void move(String destination) {
        System.out.println("tiger move to "+destination+".");
    }
 
    void drink() {
        System.out.println("tiger lower it is head and drink");
    }
}
 
class Goat1{
    private static String name="goat";
 
    String getName() {
        return this.name;
    }
 
    void move(String destination) {
        System.out.println("goat move to "+destination+".");
    }
 
    void drink() {
        System.out.println("goat lower it head to drink");
    }
}
 
class Rabbit1{
    private static String name="rabbit";
 
    String getName() {
        return this.name;
    }
 
    void move(String destination) {
        System.out.println("rabbit move to "+destination+".");
    }
 
    void drink() {
        System.out.println("rabbit put out it is tongue and drink");
    }
}
 
class Farmer1{
    public void bringWater(String destination){
        System.out.println("Farmer bring water to " + destination + ".");
    }
 
    public void feedWater(Goat1 goat){ // polymorphism
        this.bringWater("Feeding Room");
        goat.move("Feeding Room");
        goat.drink();
    }
    public void feedWater(Tiger1 tiger){ // polymorphism
        this.bringWater("Feeding Room");
        tiger.move("Feeding Room");
        tiger.drink();
    }
 
    public void feedWater(Rabbit1 rabbit1) {
        this.bringWater("Feeding Room");
        rabbit1.move("Feeding Room");
        rabbit1.drink();
    }
}
 
public class Test1{
    public static void main(String[] args) {
        Farmer1 farmer1=new Farmer1();
        Tiger1 tiger1=new Tiger1();
        Goat1 goat1=new Goat1();
        Rabbit1 rabbit1=new Rabbit1();
        farmer1.feedWater(tiger1);
        farmer1.feedWater(goat1);
        farmer1.feedWater(rabbit1);
    }
}

手敲了這個例子,發(fā)現(xiàn)基礎(chǔ)很重要呀,以前學(xué)習(xí)的不細(xì)致,導(dǎo)致很多地方迷糊不知道為啥那么寫。

(1)一個.java文件中可以定義多個class類,但是只有一個可以定義為public,且這個類名必須和文件名相同

(2)抽象類繼承抽象類,不用覆蓋其抽象方法(原因也很簡單呀,本身他就是抽象的不能實現(xiàn)方法體)。而非抽象類繼承抽象類必須覆蓋抽象方法,非抽象方法非必要。

(3)重寫和重載的區(qū)別(高頻面試題 ?)

重載:定義相同的方法名,參數(shù)不同。屬于編譯時多態(tài)

重寫:子類重寫父類的方法@Override。屬于運行時多態(tài)

以上是“Java抽象定義的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI