java利用多态实现接口

/*
	分析:从具体到抽象
	老师和学生都会抽烟,
	
	具体:老师	年龄、睡觉、工作
		  学生	年龄、睡觉、工作
		  
		  由于老师和学生都有共性提取出一个父类
		  
			人类:成员变量
						年龄
				  成员方法
						睡觉(公共方法)
						工作(特有方法)
			
			抽烟是个额外的功能,部分老师和学生可能会具有抽烟的属性,所以将其定义为接口
			
			抽烟接口
				部分老师,部分学生
				
	实现:从抽象到具体
*/
//定义抽烟接口
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以及其父类

猜你喜欢

转载自blog.csdn.net/zfliu96/article/details/83040424