多态的最重要的一条:子类的实例用父类来引用(即父类的引用指向子类的实例)
直接上代码:
没用多态时的代码:
注:考察老师时,每考察一位老师就需要创建一个考察老师方法,然后再依次调用方法,这样代码太过于繁琐。
而,使用多态呢,在考察老师时直接将老师这个对象当做实参传到考察老师的方法里,而形参需要为父类的形式,如:代码里的TeacherInter。这样就可以简化代码,而且功能更加的健全。
abstract class Teacher{
String name;
int age;
/**
*继承多态的抽象方法
*/
public abstract void teachLession();
public void sleep(){
System.out.println(name +"正在睡觉");
}
}
class JavaTeacher extends Teacher{
/**
* 实现了讲课的第一种形态
*/
public void teachLession(){
System.out.println(name + "正在讲多态");
}
}
class PHPTeacher extends Teacher{
/**
* 实现了讲课的第二种形态
*/
public void teachLession(){
System.out.println(name + "正在讲PHP");
}
}
class Leader{
/**
* 考察java老师讲课情况
*/
public void checkJavaTeacher(JavaTeacher jt){
System.out.println("开始考察");
//开始讲课
jt.teachLession();
System.out.println("考察结束");
}
/**
* 考察PHP老师讲课情况
*/
public void checkPHPTeacher(PHPTeacher pt){
System.out.println("开始考察");
//开始讲课
pt.teachLession();
System.out.println("考察结束");
}
}
class InterDemo8{
public static void main(String[] args){
JavaTeacher jt = new JavaTeacher();
jt.name = "张三";
PHPTeacher pt = new PHPTeacher();
pt.name = "李四";
//创建领导对象
Leader leader = new Leader();
//领导考察java老师张三
leader.checkJavaTeacher(jt);
leader.checkPHPTeacher(pt);
}
}
引用多态后的代码:
interface TeacherInter{
public void teachLession();
public void sleep();
}
class JavaTeacher implements TeacherInter{
String name;
int age;
public JavaTeacher(String name){
this.name = name;
}
/**
* 实现了讲课的第一种形态
*/
public void teachLession(){
System.out.println(name + "正在讲多态");
}
public void sleep(){
System.out.println(name+"在睡觉");
}
public void smoking(){
System.out.println(name+"正在抽烟");
}
}
class PHPTeacher implements TeacherInter{
String name;
int age;
public PHPTeacher(String name){
this.name = name;
}
/**
* 实现了讲课的第二种形态
*/
public void teachLession(){
System.out.println(name + "正在讲PHP");
}
public void sleep(){
System.out.println(name+"睡绳子");
}
}
class Leader{
public void checkTeacher(TeacherInter t){
String teacher = "";
//instanceof可以判断我们多态的引用变量到底是什么类型
if(t instanceof JavaTeacher){
teacher = "java老师";
}else if(t instanceof PHPTeacher){
teacher = "PHP老师";
}
System.out.println("开始考察"+teacher);
//老师开始讲课
t.teachLession();
System.out.println("考察结束");
}
}
class InterDemo10{
public static void main(String[] args){
//子类的实例用父类的类型来接收
TeacherInter jt = new JavaTeacher("张三");
TeacherInter pt = new PHPTeacher("李四");
//子类中的特有方法不能通过父类来调用
//jt.smoking();错误
Leader leader = new Leader();
leader.checkTeacher(pt);
leader.checkTeacher(jt);
}
}