今天到接口这里,开始还在回忆到底什么是接口呢。到今天复习完为止,确实也没有深入明白接口到底是什么。因为和抽象类有些相似的地方,以至于现在让人摸不着头脑。所以才先来看今天的work吧。
今天的work_1是熟悉接口,设计实现一个发声接口
package Java的接口;
/*此例说设计和实现一个Sound接口,该接口具有发声功能,同时还能调节声音大小*/
public interface work_1_Sound {
//发出声音
public void makeSound();
//降低音量
public void decreaseSound();
//增大音量
public void stopSound();
//接口和抽象类看起来实现方式是一样的哦
}
接口的设计就是这样interface定义,在接口里面只需要有函数的声明即可。
接口的这些功能将会有一个对象类来实现
package Java的接口;
public class work_1_Radio implements work_1_Sound{
public void makeSound() {
System.out.println("收音机为您服务~");
}
public void decreaseSound() {
System.out.println("降低收音机音量");
}
public void stopSound() {
System.out.println("关闭收音机");
}
}
链接接口用implements来实现。
这里人家还用了一个应用程序类来实现接口的功能
package Java的接口;
public class work_1_SoundDisplay {
public void display(work_1_Sound sound){
sound.makeSound();
sound.decreaseSound();
sound.stopSound();
}
}
这里是初始化了一个接口对象sound,这样是可以的哦?因为是最后这里的参数就已经都是子类的实例了的原因吧
package Java的接口;
import java.util.Scanner;
public class work_1_test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("您想听什么:0-收音机 1-随声听 2-手机");
int choice;
choice=input.nextInt();
work_1_SoundDisplay sd=new work_1_SoundDisplay();
switch (choice) {
case 0:
sd.display(new work_1_Radio());
break;
case 1:
sd.display(new work_1_Walkman());
break;
case 2:
sd.display(new work_1_Phone());
break;
default:
System.out.println("没有您的选择");
break;
}
}
}
仅仅new接口类是不可以的,一定是要其下的一个子类的实例,所以work1它说调小音量,那么这些设备一定会有调小音量此功能的,这就是所谓的从顶到下吧。
而抽象类是子类们都有的东西,可以用抽象类父类来表示。这就是所谓从底到上吧。
再来看看work_2,work_2又是饲养员喂动物的问题。所以先上运行实例:
——————————————————
欢迎来到动物园
我是饲养员纯纯
福贵正在吃香喷喷的骨头
汪汪汪~
二蛋正在吃香嘭嘭的金枪鱼
喵喵喵~
——————————————————
嗯最后要的就是在饲养员给喂食后,动物们发出欢快的叫声
首先三个类是必须有的,饲养员(feeder),动物(animal),食物(food)
食物里面有鱼,但是鱼同时也是动物,因此可以将food定义为接口,而鱼又可以继承animal。
所以分析完毕以后,构造出UML类图
Food最终还是选择了作为接口。上面那个animal是抽象类,所以类名和抽象方法应是斜体字。
package Java的接口;
/*又是一个模拟饲养员喂动物,喂完动物之后动物们会开心的发出声来*/
public abstract class work_2_Animal {
private String name;
private int age;
public work_2_Animal(String n,int a){
this.name=n;
this.age=a;
}
public abstract void shout();
public abstract void eat(work_2_Food food);
public void setName(String n) {
this.name=n;
}
public String getName() {
return name;
}
public void setAge(int a ) {
this.age=a;
}
public int getAge(){
return age;
}
}
所以抽象这个动物类没有大问题,今天是看到,抽象类里面也可以有构造函数。因为这里已经是想好的父类了。
package Java的接口;
public interface work_2_Food {
public abstract String getName();
}
而被选为接口的Food类包含了一个抽象的方法
package Java的接口;
public class work_2_Fish extends work_2_Animal implements work_2_Food{
public work_2_Fish(String n, int a) {
super(n, a);
}
public void shout(){
}
public void eat(work_2_Food food) {
}
}
package Java的接口;
public class work_2_Bone implements work_2_Food{
private String n;
public work_2_Bone(String n){
this.n=n;
}
public String getName(){
return n;
}
}
package Java的接口;
public class work_2_Cat extends work_2_Animal{
public work_2_Cat(String name,int age){
super(name, age);
}
public void shout(){
System.out.println("喵喵喵~");
}
public void eat(work_2_Food food){
System.out.println(getName()+"正在吃香嘭嘭的"+food.getName());
shout();
}
}
package Java的接口;
public class work_2_Dog extends work_2_Animal{
public work_2_Dog(String n, int a) {
super(n, a);
}
public void shout(){
System.out.println("汪汪汪~");
}
public void eat(work_2_Food food){
System.out.println(getName()+"正在吃香喷喷的"+food.getName());
shout();
}
}
以上两两分为是animal和food的子类,值得注意的是,fish不仅extends了animal而且implements了food,这是关键所在,让我们体会继承和接口一起使用的节奏。
package Java的接口;
public class work_2_Feeder {
private String name;
public work_2_Feeder(String n){
this.name=n;
}
public void say() {
System.out.println("欢迎来到动物园");
System.out.println("我是饲养员"+getName());
}
public void feed(work_2_Animal a,work_2_Food f) {
a.eat(f);
}
public String getName() {
return name;
}
public void setName(String n) {
this.name=n;
}
}
package Java的接口;
public class work_2_Test {
public static void main(String[] args) {
work_2_Feeder feed=new work_2_Feeder("纯纯");
feed.say();
work_2_Dog dog=new work_2_Dog("福贵", 6);
work_2_Food fod=new work_2_Bone("骨头");
feed.feed(dog,fod);
work_2_Cat cat=new work_2_Cat("二蛋", 5);
work_2_Food fd=new work_2_Fish("金枪鱼",2);
feed.feed(cat, fd);
}
}
饲养员类也没有什么毛病,主类里的测试也照常进行。
这里抽象定义了动物
而接口则表达了食物和动物的联系
到这段时间的巩固学习为止,这几天的内容算是第一大重点和难点了吧。
网上各种 学习,主要最后还是要转化成自己的话,自己的理解,自己表达出来。
所以说,
鱼,本质上可以说是动物类,但是它也具有当作食物被吃的行为。
鱼应该很开心。