/*
分析:从具体到抽象
老师和学生都会抽烟,
具体:老师 年龄、睡觉、工作
学生 年龄、睡觉、工作
由于老师和学生都有共性提取出一个父类
人类:成员变量
年龄
成员方法
睡觉(公共方法)
工作(特有方法)
抽烟是个额外的功能,部分老师和学生可能会具有抽烟的属性,所以将其定义为接口
抽烟接口
部分老师,部分学生
实现:从抽象到具体
*/
//定义抽烟接口
interface Smoke{
//接口里面只能有抽象的方法名,不能有{}
public abstract void smoke();
//以下三个抽象方法是因为测试接口的多态加的
public abstract void sleep();
public abstract void work();
//抽象方法中可以有int返回类型的方法
public abstract int getAge();
}
//定义抽象类人
abstract class People{
private int age;
public People(){
}
public People(int age){
this.age=age;
}
public void setAge(int age){
this.age=age;
}
public int getAge( ){
return age;
}
public void sleep(){
System.out.println("睡觉");
}
//特有方法抽象化
abstract public void work();
}
//具体老师类
class Teacher extends People{
public Teacher (){
}
public Teacher(int age){
super(age);
}
public void work(){
System.out.println("老师的工作是教书育人");
}
}
//具体学生类
class Student extends People{
public Student(){
}
public Student(int age){
super(age);
}
public void work(){
System.out.println("学生的工作是学习");
}
}
//抽烟的老师
class SmokeTeacher extends Teacher implements Smoke{
public SmokeTeacher(){
}
public SmokeTeacher(int age){
super(age);
}
public void smoke (){
System.out.println("抽烟的老师");
}
}
//抽烟的学生
class SmokeStudent extends Student implements Smoke{
public SmokeStudent(){
}
public SmokeStudent(int age){
super(age);
}
public void smoke(){
System.out.println("抽烟的学生");
}
}
class InterfaceTest{
public static void main(String [] args){
//测试学生
SmokeStudent ss1=new SmokeStudent();
ss1.setAge(20);
System.out.println(ss1.getAge());
ss1.sleep();
ss1.work();
ss1.smoke();
System.out.println("-----------------------");
SmokeStudent ss2=new SmokeStudent(18);
System.out.println(ss2.getAge());
ss2.sleep();
ss2.work();
ss2.smoke();
System.out.println("-----------------------");
//测试多态
Smoke ss3=new SmokeTeacher(30);
ss3.smoke();
//测试接口多态时以下方法在接口中必须抽象要不会报错。
System.out.println(ss3.getAge());
ss3.sleep();
ss3.work();
}
}
注意150-153行代码和29-32行代码共存,要不会报错。
原因:
由于ss3是利用多态来实现接口,所以接口中必须声明这三个抽象方法getAge、sleep、work,不然程序会报错。
Smoke ss3=new SmokeTeacher(30); 编译时看左边Smoke接口中,运行是看右边SmokeTeacher以及其父类