多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
在java中多态可以体现在方法上比如方法的重载,同名方法可以有不同的执行结果。多态也可以体现在面向对象中,一个对象可以使用多种类型进行表示。
面向方法层面的多态:就是方法重载
面向对象层面的多态:把子类的对象类型给了父类。
2.多态的特点- 多态的前提1:是继承
- 多态的前提2:要有方法的重写
- 父类引用指向子类对象,如:Animal a = new Cat();
- 多态中调用成员方法时,编译看左边,运行看右边
案例需求:开在Teacher教员类的基础上,开发一个类代表总部,负责对各教员进行评估,评估内容包括教员的自我介绍以及教员的授课。
教师:Teacher教员类(教员姓名, 所在中心属性;授课方法和自我介绍方法),其中教员分为Java教员以及.NET教员,各自的要求如下:
1.Java教员
具有属性:姓名、所在中心。
具有方法:
授课giveLesson()(授课的步骤依次是:打开Eclipse、实施理论课授课)、
自我介绍。introduction() (输出教员的姓名和所在中心,我是一名java讲师)
2.NET教员
具有属性:姓名、所在中心。
具有方法:
授课giveLesson()(授课的步骤依次是:打开Visual Studio 2005、实施理论课授课)、
自我介绍。introduction() (输出教员的姓名和所在中心,我是一名.net讲师)
总部类: 负责对教员的评估,并进行测试
具有的方法: 评估教员的方法 judge() (先调用教员的授课方法,再调用教员的自我介绍方法)
父类
public class Humen {
String name;
String where;
public void giveLesson(){
}
public void introduction(){}
}
net子类
public class Nettc extends Humen{
public void introduction(){
System.out.println(name+where+"我是一名net讲师");
}
public void giveLesson(){
System.out.println("授课的步骤依次是:打开Visual Studio 2005、实施理论课授课");
}
}
java子类
public class Javatc extends Humen{ public void introduction(){ System.out.println(name+where+"我是一名java讲师"); } public void giveLesson(){ System.out.println("授课的步骤依次是:打开Eclipse、实施理论课授课"); }}
总部类
public class Teacher {
public static void main(String[] args) {
Humen javatc = new Javatc();
javatc.name="赵峰";
javatc.where="湖南湘潭";
javatc.introduction();
javatc.giveLesson();
Humen nettc = new Nettc();
nettc.name="郭寄";
nettc.where="湖南山区";
nettc.introduction();
nettc.giveLesson();
}
}
4.向上转型和向下转型
向上转型:可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。
例如上面题中的:
Humen javatc = new Javatc();
Humen nettc = new Nettc();
父类类型 子类对象的名字=new 子类构造方法();
说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重过后的功能。但是此时对象是把自己看做是父类类型的,所以其他资源使用的还是父类型的。
向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。这个是之前向上造型过的子类对象仍然想执行子类的特有功能,所以需要重新恢复成子类对象
例如:
Javatc humen= new Humen();
子类类型 父类对象名字= new 父类构造方法;
说明:向下转型时,是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能。
常见多态代码体现在三个地方:
* 1. 直接定义变量:父类型变量接收子类对象
* 2. 方法参数:父类型的形参接收子类型的实参对象
* 3. 返回值:父类型的返回值类型接收子类型的返回值对象



