java如何定义接口、实现接口的类、使用接口的类

代码结构与功能

  1. 接口定义 (Animal):

     

    java

 
 
 
interface Animal { 
void sound(); 
  •  
    }

    这里定义了一个名为Animal的接口,其中声明了一个方法sound()。接口是一种完全抽象的类型,它不包含任何实现,仅定义了方法的签名。这使得任何实现该接口的类都必须提供sound()方法的具体实现。

  • 具体实现类 (DogCat):

     

    java

 
 
 
class Dog implements Animal { ... } 
  •  
    class Cat implements Animal { ... }

    DogCat类分别实现了Animal接口,并提供了sound()方法的具体实现。这意味着每个类都将按照动物的实际行为来发出声音。

  • 使用接口的类 (AnimalShelter):

     

    java

 
 
 
class AnimalShelter { 
 
private Animal animal; 
 
 
 
public AnimalShelter(Animal animal) { 
 
this.animal = animal; 
 
} 
 
 
 
public void takeCare() { 
 
animal.sound(); 
 
} 
  •  
    }

    AnimalShelter类持有一个Animal类型的对象(即animal成员变量),并通过构造函数接收一个实现了Animal接口的对象。这意味着AnimalShelter并不直接关心它照顾的是哪种动物,只要这个动物能够响应sound()请求即可。takeCare()方法调用animalsound()方法,展示了对动物的照顾行为。

  • 应用示例 (Main 类):

     

    java

 
 
 
public class Main { 
 
public static void main(String[] args) { 
 
AnimalShelter shelter = new AnimalShelter(new Dog()); 
 
shelter.takeCare(); // 输出: Dog barks 
 
 
 
shelter = new AnimalShelter(new Cat()); 
 
shelter.takeCare(); // 输出: Cat meows 
 
} 
  1.  
    }

    在主程序中,首先创建了一个AnimalShelter实例并传入一个新的Dog对象,然后调用takeCare()方法,输出“Dog barks”。接着,用同样的方式处理Cat对象,输出“Cat meows”。

为什么这样写?

  • 解耦: 通过使用接口,AnimalShelter类与具体的动物类(如DogCat)解耦。它不知道也不关心具体是哪种动物,只需知道动物能执行sound()操作即可。这种方式提高了代码的可扩展性和可维护性,如果未来需要添加新的动物类型,只需实现Animal接口,无需修改AnimalShelter类。

  • 依赖注入: 构造器注入的方式将Animal的实例传递给AnimalShelter,这是一种依赖注入的实践。这种方式减少了硬编码的依赖关系,使得组件更加灵活和可测试。

底层原理

  • 多态性: Java中的接口和继承机制支持多态性。这意味着在运行时,AnimalShelter类可以处理任何实现了Animal接口的对象,利用JVM的动态绑定(也称为晚期绑定或运行时绑定),具体调用哪个版本的sound()方法是在运行时根据实际对象的类型确定的。

  • 松耦合: 设计模式和原则如接口隔离原则(ISP)、依赖倒置原则(DIP)在这里得到体现。通过面向接口编程而非具体实现,降低了模块间的耦合,促进了代码的复用和系统的灵活性。

总之,这样的设计使系统更加模块化,易于扩展和维护,同时也提升了代码的可读性和可测试性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值