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