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