1.概念
在Java中接口是一个抽象的数据类型,在接口里面我们会定义类应该遵循的行为规范,并不会去具体实现,只是告诉了接了该接口的类一定要实现些什么方法。接口中可以有常量、方法 和 嵌套类型的声明(就是在该接口内部定义其他类型,如接口、类、枚举)。
一个接口可以被多个类去实现,一个类也可以去实现多个接口(以 implements 1, 2 , 3, ..... 的形式)。
2.代码示例
我们还是以动物类(Animal)为例举例。
我们首先定义一个动物类(Animal):
class Animal{
private String name; //名字
private int age; //年龄
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
其中包含了两个私有变量 名字(name) 和 年龄(age),还有五个公共的方法,getName() 返回动物名字、getAge()返回动物年龄、setName() 修改动物名字、setAge() 修改动物年龄、和 构造方法 Animal( String name, int age)。
然后我们定义一个 IAbility 接口:
interface IAbility{
void showInfo(); //输出动物信息
void cry(); //动物发出叫声
}
可以看到我们在接口中只是给出了两个方法的行为规范,并没有具体实现。
我们定义两个 Animal 的 子类,分别是 小狗(Dog) 、 小猫(Cat)。
class Dog extends Animal implements IAbility {
public Dog( String name, int age) {
super( name, age);
}
@Override
public void showInfo() {
System.out.println("我是一只狗,我的名字是" + getName() + ",今年" + getAge() + "岁");
}
@Override
public void cry() {
System.out.println("旺旺");
}
}
class Cat extends Animal implements IAbility {
public Cat( String name, int age) {
super( name, age);
}
@Override
public void showInfo() {
System.out.println("我是一只猫,我的名字是" + getName() + ",今年" + getAge() + "岁");
}
@Override
public void cry() {
System.out.println("喵喵");
}
}
在这两个子类中我们都实现了 IAbility 接口,可以看到在两个子类中我们都实现 接口 IAbility 中的方法, 只是根据它们自身的需求,实现的的内容有些不同。
我们定义一个模拟器类(Simulator):
class Simulator {
public void playSound(IAbility animal) {
animal.showInfo();
animal.cry();
try {
Cat a = (Cat)animal;
System.out.println(a.getName());
System.out.println(a.getAge());
}
catch (Exception e) {
Dog a = (Dog) animal;
System.out.println(a.getName());
System.out.println(a.getAge());
}
}
}
在这个模拟器类中,我们通过 playSound( IAbility animal) 方法去调用接口中的 showInfo() 和 cry() 方法。注意在 playSound( IAbility animal) 方法中,形式参数为一个接口类,这个时候我们又想要单独输出动物的名字和年龄怎么办呢?
我们需要使用强制类型转换,而这时候我们有两个子类 Cat 和 Dog, 那到底是哪一个呢,所以我们使用 java异常处理,try-catch块去处理,在 try中 当我们强制类型转换错了后,会抛出一个错误信息,让 catch 接收到并进行下一步处理。
当然除了用 java异常处理,我们还可以使用 instanceof 运算符去判断。
在Java中 instanceof 用于检查一个对象是否是一个类的实例或者是该类的子类的实例
我们可以将 上面代码中的 try-catch 块 改成这样:
if(animal instanceof Dog a) {
System.out.println(a.getName());
System.out.println(a.getAge());
} else if (animal instanceof Cat a) {
System.out.println(a.getName());
System.out.println(a.getAge());
}
3.代码综合
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
IAbility animal=null;
// 输入 1 为小狗, 输入 2 为小猫
int type=input.nextInt();
String name=input.next();
int age=input.nextInt();
if (type==1)
animal=new Dog(name,age);
else
animal=new Cat(name,age);
Simulator sim=new Simulator();
sim.playSound(animal);
input.close();
}
}
class Animal{
private String name; //名字
private int age; //年龄
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
interface IAbility{
void showInfo(); //输出动物信息
void cry(); //动物发出叫声
}
class Dog extends Animal implements IAbility {
public Dog( String name, int age) {
super( name, age);
}
@Override
public void showInfo() {
System.out.println("我是一只狗,我的名字是" + getName() + ",今年" + getAge() + "岁");
}
@Override
public void cry() {
System.out.println("旺旺");
}
}
class Cat extends Animal implements IAbility {
public Cat( String name, int age) {
super( name, age);
}
@Override
public void showInfo() {
System.out.println("我是一只猫,我的名字是" + getName() + ",今年" + getAge() + "岁");
}
@Override
public void cry() {
System.out.println("喵喵");
}
}
class Simulator {
// 输出动物自我介绍和叫声,并且单独输出动物的名字和年龄
public void playSound(IAbility animal) {
animal.showInfo();
animal.cry();
try {
Cat a = (Cat)animal;
System.out.println(a.getName());
System.out.println(a.getAge());
}
catch (Exception e) {
Dog a = (Dog)animal;
System.out.println(a.getName());
System.out.println(a.getAge());
}
}
}
标签:Java,name,示例,age,System,接口,println,public,out
From: https://blog.csdn.net/2301_80284166/article/details/137122502