java - 我必须在这个问题中使用 instanof 吗?或者我应该如何编码?
问题描述
我为我的问题写了一个示例代码。我想使用 polimorfism 并尝试通过对象类型更改变量。这段代码有效,但它是最好的方法吗?我应该在两个类中使用通用方法来返回变量吗?谢谢
package example;
import java.util.Scanner;
class Animal{}
class Dog extends Animal{}
class Bird extends Animal{}
public class Example {
public static void main(String[] args) {
Animal a;
int leg=0;
Scanner k=new Scanner(System.in);
String s=k.next();
if(s.equals("dog")) a=new Dog();
else a=new Bird();
if(a instanceof Dog) leg+=4;
else if(a instanceof Bird) leg+=2;
System.out.println(leg);
}
}
解决方案
您应该将通用功能放入父类Animal
,并将特定功能实现到子类Bird
和Dog
.
abstract class Animal {
abstract int legs();
}
class Bird extends Animal {
@Override
int legs() {
return 2;
}
}
class Dog extends Animal {
@Override
int legs() {
return 4;
}
}
不需要instanceof
,只要调用 的legs
方法,Animal
实现类就会输出正确的值。
public class Example {
public static void main(String[] args) {
Animal animal;
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
if(s.equals("dog")) {
animal = new Dog();
} else {
animal = new Bird();
}
System.out.println(animal.legs());
}
}
推荐阅读
- firebase - Firestore、Firebase 身份验证和具有多个业务实体的 Firestore 规则
- javascript - 如何在 EM6 中解决此问题
- python - plotly python 中的 include_plotlyjs="cdn" 对生成的 HTML 有什么作用?
- python - Django 频道 - 如何从外部脚本向组发送消息?
- mysql - SUBSTRING 函数 mysql
- node.js - -bash: npm: 使用Node LTS安装包后找不到命令
- python - csv.writerow 在添加 for 循环后现在可以工作了吗?
- azure-devops-migration-tools - 使用 VSTS 同步迁移工具配置文件中的 DevOps 查询 ID 迁移 Azure DevOps 工作项
- sql - SQL:使用案例在单独的列中查找重复项和标记
- javascript - setState 函数没有有效地更新 rows 变量,因此它没有反映在 UI 中?