注意(子类实例赋给父类引用):
- 父类引用不能调用子类中特定方法;
- 父类引用调用的是子类重写或实现父类的方法,引用变量是子类对象的地址。
创建一个抽象类Teacher,包括name属性和TeachClass()方法;
public abstract class Teacher {
/**
*name:老师姓名,字符类型
*TeachClass:老师讲课,继承多态的抽象方法
*/
String name;
public abstract void TeachClass();
}
为Teacher创建两个子类:JavaTeacher、PhpTeacher;
public class JavaTeacher extends Teacher {
public JavaTeacher(){
this.name="哈哈哈";
}
public JavaTeacher(String name) {
this.name = name;
}
/**
*实现讲课的第一种形态
*/
public void TeachClass() {
System.out.println("java老师"+this.name+"正在教课");
}
}
public class PhpTeacher extends Teacher{
public PhpTeacher(){
this.name="嘿嘿嘿";
}
public PhpTeacher(String name) {
this.name = name;
}
/**
*实现讲课的第二种形态
*/
public void TeachClass(){
System.out.println("php老师"+this.name+"正在教课");
}
}
创建一个Leader类,有CheckTeach()方法;
public class Lender {
/**
*检测老师教学
*/
public void CheckTeach(Teacher t){
// 老师开始讲课
t.TeachClass();
}
}
创建测试类TestTeacher;
在创建Teacher子类对象时,用父类类型的变量接收,这样可以保证在Leader类中不用为每一个Teacher子类写CheckTeach()方法。
public class TestTeacher {
public static void main(String[] args) {
// 子类实例赋给父类引用
Teacher jt= new JavaTeacher();
Teacher pt= new PhpTeacher("yoyoyoyo...");
Lender lender = new Lender();
lender.CheckClass(jt);
lender.CheckClass(pt);
}
}