16_Java中接口与类和抽象类的关系
Java中接口的与类和抽象类的关系
抽象类:抽象对象,接口:抽象方法,两者配合,一个负责将一类对象抽象化,一个负责将特殊方法,后加特殊方法抽象化,然后再用一个具体类进行继承与实现来达到很好的效果
一、接口与类
1、类和类的关系:
继承关系,只能单继承,但是可以多层继承
2、类和接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
3、接口和接口的关系:
继承关系,可以是单继承,也可以是多继承
4、参考代码:
package com.itheima_04; /* 接口与接口之间是继承关系 并且可以进行多继承(接口的目的主要是提供抽象方法) */ public interface Inter1 extends Inter3, Inter2{ }
package com.itheima_04; public interface Inter2 { }
package com.itheima_04; public interface Inter3 { }
package com.itheima_04; /* 一个类在 继承一个类的基础上 还可以实现多个接口 */ public class inertImpl extends Object implements Inter1, Inter2, Inter3{ }
二、接口与抽象类的区别(事物与行为的抽象)
1、成员区别:
抽象类: 变量,常量; 有构造方法; 有抽象方法,也有非抽象方法
接 口: 常量; 无构造方法; 抽象方法
2、关系区别:
类与类:继承与单继承
类与接口:实现,可以单实现,也可以多实现
接口与接口:继承,单继承,多继承
3、设计理念区别
抽象类: 对象抽象,包括属性、行为
接口: 对行为抽象,主要是行为
举例说明:
门和报警的例子:
门:都有open()和close()两个动作,这个时候,我们可以分别使用抽象类和接口来定义这个概念
在此基础上添加报警功能
//抽象类 public abstract class Door{ public abstract void open(); public abstract void close(); public abstract void alarm(); //可以发现万一有的门不能报警? }
//接口 public interface Door{ //public abstract void open(); //public abstract void close(); void open(); void close(); void alarm(); //有的又只能报警呢? }
所以有:
public interface Alram{ void alarm(); //将报警独立于一个接口(需要即实现) } public abstract class Door{ //将门都有的放在门的抽象类中 public abstract void open(); public abstract void close(); } //而这个类就可以取所需要的,也还可以再写一些特殊的接口来多实现,这样有利于代码的复用性和维护性 public class AlramDoor extends Door implements Alram{ public void open(){ //... } public void close(){ //... } public void alarm(){ //... } }
三、案例运动员和教练
需求:我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的工作人员都需要学习英语。请用知识分析,这个案例中有哪些具体类,那些抽象类,那些接口,并用代码实现
分析:具体到抽象 乒乓球、篮球(运动员) 乒乓球、篮球(教练) 【都是人;有的要学英语】
实现:从抽象到具体
使用:使用的是具体的类和对象
package com.itheima_05; //说英语接口 public interface SpeakEnglish { public abstract void speak(); }
package com.itheima_05; //抽象的人类 public abstract class Person { //成员变量 private String name; private int age; //构造方法 public Person(){} public Person(String name, int age){ this.name = name; this.age = age; } //set\get\show方法 public void setName(String name){this.name = name;} public String getName(){return this.name;} public void setAge(int age){this.age = age;} public int getAge(){return this.age;} public void show(){ System.out.println(getName() + "," + getAge()); } //定义一个 抽象类 public abstract void eat(); }
package com.itheima_05; //抽象教练类 public abstract class Coach extends Person{//抽象类无需重写父类抽象方法 //构造方法 public Coach(){} public Coach(String name, int age){ super(name, age); } //定义一个教练类的特殊抽象方法 public abstract void teach(); }
package com.itheima_05; //抽象运动员类 public abstract class Player extends Person{ //定义构造方法 public Player(){} public Player(String name, int age){ super(name, age); } //定义一个抽象运动员的特殊方法 public abstract void study(); }
package com.itheima_05; //篮球教练类 public class BasketballCoach extends Coach{ //构造方法 public BasketballCoach() { } public BasketballCoach(String name, int age) { super(name, age); } //重写抽象类 @Override public void eat(){ System.out.println("篮球教练吃羊肉,喝羊奶"); } @Override public void teach(){ System.out.println("篮球教练教如何运球和投篮"); } }
package com.itheima_05; //篮球运动员类 public class BasketballPlayer extends Player{ //构造方法 public BasketballPlayer(){} public BasketballPlayer(String name, int age){ super(name, age); } //重写抽象方法 @Override public void eat(){ System.out.println("篮球运动员吃蔬菜,喝肉汤"); } @Override public void study(){ System.out.println("篮球运动员学习如何运球和投篮"); } }
package com.itheima_05; //乒乓球教练类 public class PingPangCoach extends Coach implements SpeakEnglish{ //构造方法 public PingPangCoach() { } public PingPangCoach(String name, int age){ super(name, age); } //重写抽象方法 @Override public void eat(){ System.out.println("乒乓球教练吃牛肉,和牛奶"); } @Override public void teach(){ System.out.println("乒乓球教练教如何发球和接球"); } @Override public void speak(){ System.out.println("乒乓球教练说英语"); } }
package com.itheima_05; //乒乓球运动员类 public class PingPangPlayer extends Player implements SpeakEnglish{ //构造方法 public PingPangPlayer(){} public PingPangPlayer(String name, int age){ super(name, age); } //重写抽象方法 @Override public void eat(){ System.out.println("乒乓球运动员吃大米饭,和排骨汤"); } @Override public void study(){ System.out.println("乒乓球运动员学发球和接球"); } @Override public void speak(){ System.out.println("乒乓球运动员说英语"); } }
package com.itheima_05; /* 测试类 */ public class PersonDemo { public static void main(String[] args){ //创建对象 PingPangPlayer ppp = new PingPangPlayer(); ppp.setName("张三"); ppp.setAge(30); ppp.show(); ppp.eat(); ppp.study(); ppp.speak(); System.out.println("--------------------------"); BasketballPlayer bp = new BasketballPlayer(); bp.setName("李四"); bp.setAge(32); bp.show(); bp.eat(); bp.study(); } }
本文作者:如此而已~~~
本文链接:https://www.cnblogs.com/fragmentary/p/16756737.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步