(多态)子类实例赋给父类引用的简单例子

注意(子类实例赋给父类引用):

  • 父类引用不能调用子类中特定方法;
  • 父类引用调用的是子类重写或实现父类的方法,引用变量是子类对象的地址。

创建一个抽象类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);
    }
}

你可能感兴趣的:(java)