1.抽象方法抽象类
介绍
抽象方法:
将共性的行为(方法)抽取到父类之后,
由于每一个子类执行的内容是不一样,
所以,在父类中不能确定具体的方法体。
该方法就可以定义为抽象方法。
抽象类:
如果一个类中存在抽象方法,那么该类就必须声明为抽象类
定义格式
抽象方法:
public abstract 返回值类型方法名(参数列表); //没有方法体
抽象类:
public abstract class 类名{}
注意事项
1.抽象类不能实例化
2.抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
3.抽象类可以有成员变量,构造方法
4.抽象类的子类,要么重写抽象类中的所有抽象方法,要么是抽象类
抽象方法抽象类的意义
可以强制子类按照抽象方法定义的格式重写,方便调用不同子类的该方法。
2.接口
介绍
接口就是一种规则,是对行为的抽象,哪个类具有该行为就实现对应的接口。
接口的定义和使用
接口用关键字interface来定义
public interface 接口名{}
接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
注意事项
1.接口不能实例化
2.接口的子类(实现类),要么重写接口中的所有抽象方法,要么是抽象类
3.接口和类的实现关系,可以单实现,也可以多实现。
public class 类名 implements 接口名1,接口名2 { }
4.实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends父类implements接口名1,接口名2 { }
接口中成员的特点
成员变量:
只能是常量
默认修饰符: public static final
构造方法:
没有
成员方法:
只能是抽象方法
默认修饰符: public abstract
JDK7以前:接口中只能定义抽象方法 (之后会讲解JDK7以后的新特性)
接口和类之间的关系
类和类的关系:
继承关系,只能单继承,不能多继承,但是可以多层继承
类和接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
注:如果多个接口中具有相同的抽象方法method1,则类在同时实现多个接口后,只需重写 一次method1方法。
接口和接口的关系:
继承关系,可以单继承,也可以多继承
注:如果接口A继承了其他接口,那么类在实现接口A后,需要重写包括接口A和其他接口在 内的所有抽象方法
3.综合案例
案例需求
编写带有接口和抽象类的标准Javabean类
我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。
 为了出国交流,跟乒乓球相关的人员都需要学习英语。
 请用所有知识分析,在这个案例中,哪些是具体类,哪些是抽象类,哪些是接口?
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
 篮球运动员:姓名,年龄,学打篮球
 乒乓球教练:姓名,年龄,教打乒乓球,说英语
 篮球教练:姓名,年龄,教打篮球
分析

代码实现
Person类
//不想让外界创建人的对象,因为创建人的对象是无意义的
//因此可以将其定义为抽象类
public abstract class Person {
    private String name;
    private int age;
    public Person(){}
    public Person(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;
    }
}Player类
public abstract class Player extends Person{
    public Player(){}
    public Player(String name,int age){
        super(name,age);
    }
    //学习
    public abstract void study();
}Coach类
public abstract class Coach extends Person{
    public Coach() {
    }
    public Coach(String name, int age) {
        super(name, age);
    }
    //教学
    public abstract void teach();
}SpeakEnglish接口
public interface SpeakEnglish {
    public abstract void SpeakEnglish();
}PingPangPlayer类
public class PingPangPlayer extends Player implements SpeakEnglish{
    public PingPangPlayer(){}
    public PingPangPlayer(String name,int age){
        super(name,age);
    }
    @Override
    public void study() {
        System.out.println("乒乓球运动员"+getName()+"在学习打乒乓球");
    }
    @Override
    public void SpeakEnglish() {
        System.out.println("乒乓球运动员"+getName()+"在说英语");
    }
}BasketballPlayer类
public class BasketballPlayer extends Player{
    public BasketballPlayer() {
    }
    public BasketballPlayer(String name, int age) {
        super(name, age);
    }
    @Override
    public void study() {
        System.out.println("篮球运动员"+getName()+"在学习打篮球");
    }
}PingPangCoach类
public class PingPangCoach extends Coach implements SpeakEnglish{
    public PingPangCoach() {
    }
    public PingPangCoach(String name, int age) {
        super(name, age);
    }
    @Override
    public void teach() {
        System.out.println("乒乓球教练"+getName()+"在教打乒乓球");
    }
    @Override
    public void SpeakEnglish() {
        System.out.println("乒乓球教练"+getName()+"在说英语");
    }
}BasketballCoach类
public class BasketballCoach extends Coach{
    public BasketballCoach() {
    }
    public BasketballCoach(String name, int age) {
        super(name, age);
    }
    @Override
    public void teach() {
        System.out.println("篮球教练"+getName()+"在教打篮球");
    }
}测试类
public class test {
    public static void main(String[] args) {
        PingPangPlayer ppp = new PingPangPlayer("马龙",30);
        ppp.study();
        ppp.SpeakEnglish();
        PingPangCoach ppc = new PingPangCoach("刘教练",50);
        ppc.teach();
        ppc.SpeakEnglish();
        BasketballPlayer bp = new BasketballPlayer("kobe",40);
        bp.study();
        BasketballCoach bc = new BasketballCoach("王教练",45);
        bc.teach();
    }
}


















