ホームページ  >  記事  >  Java  >  Java抽象定義の分析例

Java抽象定義の分析例

PHPz
PHPz転載
2023-05-10 18:58:04939ブラウズ

1. 概要

OOP の概念では、すべてのオブジェクトはクラスを通じて記述されますが、オブジェクトの記述にすべてのクラスが使用されるわけではありません。クラスに具体的なオブジェクトを説明するのに十分な情報が含まれていない場合、そのようなクラスは抽象クラスと呼ばれます。

抽象クラス: (1) 抽象クラスはオブジェクトをインスタンス化できません。オブジェクトがインスタンス化されている場合、コンパイルは通りません。抽象クラスの非抽象サブクラスのみが、メンバー変数、メンバー メソッド、コンストラクターなどを含むオブジェクト (2) を作成できます。 (3) コンストラクターとクラス メソッド (static で変更されたメソッド) は、抽象メソッドとして宣言できません。

抽象メソッド: (1) クラスに抽象メソッドが含まれる場合、そのクラスは抽象クラスである必要があります (2)任意 サブクラスは、親クラスの抽象メソッドをオーバーライドするか、それ自体を抽象クラスとして宣言する必要があります

#定義: 抽象クラス クラス名

##2. 例: 動物に餌をやる農民

動物: 抽象クラス--------getName()、move()、ドリンク()

爬虫類、哺乳類: 抽象クラスの継承

ヘビ、トラ、ヤギ、ウサギ: それぞれ爬虫類または哺乳類を継承

fammer:bringWater(), feedWater(Animal 動物)---- 指定された場所に水を運ぶ役割を果たし、動物は目的地まで移動して水を飲みます

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);
    }
}

実行結果:

##概要:Java抽象定義の分析例

それぞれの動物が抽象化されていない場合、ドリンクメソッドとムーブメソッドについては、ポリモーフィズムを実現できません。ファーマー クラスは、さまざまなパラメーターに従って複数の feedWaters をオーバーロードする必要があります。動物を追加し続けると、リロードの回数が増加します。比較と理解を容易にするために、これも従来の考え方に従って書きました。コードは次のとおりです:

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);
    }
}

この例は手で入力しましたが、基本が非常に重要であることがわかりました。勉強しませんでした。過去に慎重に記述したため、多くの場所で混乱が生じました。

(1) .java ファイルには複数のクラスを定義できますが、public として定義できるのは 1 つだけです。また、クラス名はファイル名と同じである必要があります

(2)抽象クラスの継承 抽象クラスの場合、その抽象メソッドをオーバーライドする必要はありません (理由も非常に単純で、抽象クラスなのでメソッド本体を実装できません)。非抽象クラスは抽象クラスを継承しますが、抽象メソッドをオーバーライドする必要がありますが、非抽象メソッドは必要ありません。

(3) 書き換えとオーバーロードの違い (インタビューで頻繁に聞かれる質問?)

オーバーロード: 同じメソッド名を定義しますが、異なるパラメーターを定義します。これはコンパイル時のポリモーフィズムに属します。

書き換え: サブクラスは親クラスのメソッド @Override をオーバーライドします。ランタイムポリモーフィズムに属します

以上がJava抽象定義の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。