Java接口应用代码示例

本文介绍了Java中接口的概念,展示了如何在类中定义接口并实现其行为规范,以及如何在模拟器类中通过多态调用接口方法,并利用强制类型转换或instanceof判断来获取子类实例的属性。
摘要由CSDN通过智能技术生成

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

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个使用Java lambda表达式对列表进行排序的示例代码: ``` List<String> names = Arrays.asList("peter", "anna", "mike", "xenia"); Collections.sort(names, (a, b) -> a.compareTo(b)); ``` 在这个例子中,lambda表达式 `(a, b) -> a.compareTo(b)` 是一个实现了 `Comparator` 接口的匿名函数,用于比较列表中的字符串。这个 lambda 表达式接收两个参数 `a` 和 `b`,并返回它们的字典序比较结果。 请注意,这是一个非常简单示例,在实际使用中,你可以使用lambda表达式来处理更复杂的业务场景。 ### 回答2: Java Lambda表达式是Java SE 8中引入的一种新的语法特性,它可以简化代码,使开发更加便捷和灵活。下面是一个示例,展示了Java Lambda的应用代码: 假设我们有一个存储着学生对象的List集合,每个学生对象都包含有姓名和分数。我们现在需要找到所有分数大于80分的学生并打印出他们的姓名。使用传统的方式,代码可能是这样的: ```java List<Student> students = new ArrayList<>(); // 添加学生对象到集合中 for (Student student : students) { if (student.getScore() > 80) { System.out.println(student.getName()); } } ``` 使用Lambda表达式可以将以上代码简化为: ```java List<Student> students = new ArrayList<>(); // 添加学生对象到集合中 students.stream() .filter(student -> student.getScore() > 80) .forEach(student -> System.out.println(student.getName())); ``` 在上面的代码中,我们使用了`stream()`方法将集合转换为一个流。然后,使用`filter()`方法对流中的元素进行筛选,只保留分数大于80的学生。最后,使用`forEach()`方法对每个学生对象执行打印姓名的操作。 通过使用Lambda表达式,我们可以更加简洁地实现对数据的处理,代码也更加易读和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值