gpt4 book ai didi

java - 抽象类和抽象方法

转载 作者:行者123 更新时间:2023-12-02 02:58:26 24 4
gpt4 key购买 nike

我正在编写一个程序,在其中创建一个抽象类 Bird。在这个类中有一个名为 chirp() 的方法,它打印出“chirp”。我另外创建了 2 个类,名为 Goose 和 Mallard,它们是从 Bird 扩展而来的,具有压倒一切的 chirp 方法,可以打印出不同的声音:“Honk”和“Quack”。如果我要添加另一个从 Bird 扩展而来的名为 Crow 的类,我将如何编写一个不重写的方法 chirp?

我的方法是使用不同的方法签名来创建一个方法。我认为这样做了,但它没有按照我想要的方式编译。

此外,如果我要使 Bird 中的方法抽象,我需要对 crow 类进行哪些更改...

这是我到目前为止的代码:

import java.util.Scanner;

public abstract class Bird {

public void chirp() {
System.out.println("chirp");
}

//if chirp made abstract
public abstract void chirp();

}

public class Goose extends Bird {

public void chirp() {
System.out.println("Honk");
}

}

public class Mallard extends Bird {

public void chirp() {
System.out.println("Quack");
}

}

public class Crow extends Bird {

String sound;

public void chirp(String x) {
sound = x;
}

}

public class Problem10 {

public static void main(String[] args) {
// TODO Auto-generated method stub
//Demonstration of polymorphism
Bird goose = new Goose();
Bird mallard = new Mallard();
goose.chirp();
mallard.chirp();


//Reference Variable
Bird bird = null;

//Prompt the user to enter a number that is either 1 or 2
Scanner scanner = new Scanner(System.in);
System.out.println("Input number either 1 or 2: ");
int inputInt = scanner.nextInt();
if (inputInt == 1) {
bird = new Goose();
}
else if (inputInt == 2) {
bird = new Mallard();
}
else if (inputInt == 3) {
bird = new Crow();
bird.chirp("Crow");
}
bird.chirp();
}

}

最佳答案

对于抽象性,您有三种选择:

  • Bird 是抽象的,但 chirp 不是:这意味着不存在具体的“Bird”这样的东西。 “鸟”是一个笼统的概念,将类似的事物组合在一起。事实上,chirp 是具体的,这意味着如果所有“鸟”不决定覆盖它,它们将默认说“chirp”。

  • Bird 是抽象的,chirp 也是抽象的:与上面相同,只是现在没有默认的“chirp”;任何“鸟”都必须有自己的鸣叫方式。

  • Bird 不是抽象的,chirp 也不是抽象的:在这种情况下,现在确实存在诸如真正具体的“鸟”之类的东西,它们与更多的东西不同派生出诸如“乌鸦”和“鸭子”之类的东西。所有真正的“鸟”都会说“chirp”,而更派生的“鸟”将默认说“chirp”,除非他们决定覆盖它。

在所有这三种情况下,您都可以将更多派生类型的“鸟”视为鸟,即使不存在真正的具体鸟。

覆盖时您也有多种选择:

  • 不要覆盖:您将获得如上所述的默认行为。如果方法是抽象的,则这不是一个选项。

  • 影子:这意味着更派生的类型具有与基类型同名的方法,但它实际上并没有“覆盖”它。在这种情况下,如果您将鹅视为鹅,它会说“喇叭”,但如果您将鹅视为鸟,它会说“叽叽喳喳”。换句话说,调用的方法取决于您用来调用它的引用。 (我不能 100% 确定您可以在 Java 中执行此操作,并且到目前为止还找不到示例。)

  • 重写:这意味着您实际上重写了该方法。即使你把鹅当作鸟,它仍然会说“鸣叫”。这称为多态性,因为现在您可以拥有一个“鸟”列表,即使您将它们视为鸟,它们也会以自己独特的重写方式执行任务。

关于java - 抽象类和抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42729379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com