多态时为了提高代码复用率和可读性存在的, 简单点说,就是同一个方法可以调用同一个父类的不同子类的功能,这样就避免了到每一个子类中去写这种相同的方法,具体实现见如下代码片段:
Person.java
package shunli.li.duotai;
public class Person {
private String name; //定义名称
public String getName(){ //get名称
return name;
}
public Person(String name) { //构造函数
this.name = name;
}
public void inClass() { //"课堂方法"
System.out.println("现在的人,都需要经历课堂生活");
}
}
Teacher.java
package shunli.li.duotai;
public class Teacher extends Person{
public Teacher(String name) { //构造函数
super(name); //调用父类构造函数完成构造
}
public void inClass() { //在课堂上干嘛
System.out.println("我是老师"+getName()+",课堂上我交给学生知识");
}
}
Student.java
package shunli.li.duotai;
public class Student extends Person{
public Student(String name) { //构造函数
super(name);
}
public void inClass() { //在课堂上干嘛
System.out.println("我是学生"+getName()+",我正在课堂上学习");
}
}
Main.java
package shunli.li.duotai;
public class Main {
public static void doWhatInClass(Person person) { //在课堂上做什么方法
person.inClass();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Student perStudent = new Student("李明"); //构造学生类,李明
Teacher perTeacher = new Teacher("王老师"); //构造老师类,王老师
/**
*调用自己类的方法,没得说,肯定是自己类的内容
*/
perStudent.inClass(); //调用学生类中的inclass()
perTeacher.inClass(); //调用老师类中的Inclass()
/**
*老师和学生分别调用同一个doWhatInClass()方法,结果会怎么样內
*/
doWhatInClass(perStudent);
doWhatInClass(perTeacher);
}
}
程序结果截图
结果显示,两种方法运行结果相同,这里doWhatInClass方法就是用了多态,拿Student类来说,它是Person的子类,所有它可以上转型为Person类,同时也隐藏了Student类未继承的方法和属性,Person类中具有inClass()方法,它发现Student类也同样具有,因为其本质是Student类上转型而来的所以会调用Student类的inClass();同理,Teacher类也是一样过程;这里注意如果父类具有的某种方法,子类没有重写,那么尽管使用的多态,但是调用任然会是父类的那个方法,它也是到子类查找了的,然并卵,就调用自己的了。如果把doWhatInClass方法中的参数类型,换成了Object也行,因为它是终极父类,动手试一下。