一、多态
多态是指同一个方法被调用,由于对象不同导致行为不同。
例如调用*活动方法,张三喜欢玩耍,那么他就会去玩耍。
李四喜欢学习,那么他可能去学习。调用方法因对象的不同
而产生了不同的行为。
形成多态的三个条件:
1.继承
2.子类重写父类方法。
3.父类类型,子类对象。
以下列代码为例:
public class Test {
public static void main(String[] args) {
Student stu = new Student();
Teach tea = new Teach();
freeActivi(stu);
freeActivi(tea);
} static void freeActivi(Person per){//实现多态的条件之父类类型,子类对象
per.freeActivi(); //这样对象不同可以展现出不同的行为
} //虽然参数类型是父类Person,但子类对象(stu,tea)会自动向上转型
//成Person,但调用的还是被子类重写的方法。
} class Person{
void freeActivi(){
System.out.println("*时间");
}
} class Student extends Person{ //实现多态的条件之继承
void freeActivi(){ //实现多态的条件之重写
System.out.println("玩耍");
}
} class Teach extends Person{
void freeActivi(){
System.out.println("备课");
}
}
运行结果:
玩耍
备课
可能大家会说多态有什么好处?
如果没有多态,那么每一个子类都需要重写定义以方法,例如:
static void freeActivi(Student per){
per.freeActivi();
} static void freeActivi(Teach per){
per.freeActivi();
}//假如有几十种类型,一个一个创建对应的方法就很麻烦。
如果没有多态,那么不同类型需要一个个创建方法,方法一多就非常麻烦,有了多态可以省去很多步骤。
二、转型
可能大家不是很能理解static void freeActivi(Person per)这里的Person类型。结合下面的向上转型大家可能更好理解。
对象向上转型 父类 父类对象 = 子类对象 将子类对象转为父类对象,例如 Person per = stu;
用下面代码便于大家理解
public class Test {
public static void main(String[] args) {
Student stu = new Student(); //首先创建了一个子类对象
Person per = stu; //然后将子类对象向上转型
per.freeActivi(); //然后调用父类对象中的方法。
}
//运行后我们发现,结果是玩耍,并不是*时间。
//如果对象发生向上转型,调用的一定是被子类重写的方法。
} class Person{
void freeActivi(){
System.out.println("*时间");
}
} class Student extends Person{
void freeActivi(){
System.out.println("玩耍");
}
}
运行结果:
玩耍
如果将一个子类对象向上转型后,则调用的父类方法是被子类重写之后的方法,因此可以实现多态。
但是向上转型后的对象,无法在调用子类中方法,例如将Student 类的stu对象向上转型成Person。
此时只能调用Person中的方法,无法调用Student中的方法,此时需要向下转型才能调用Student中的方法。
子类 子类对象 = (子类)父类对象; 向下转型, 父类对象转为子类对象。
如下代码:
public class Test {
public static void main(String[] args) {
Person stu = new Student(); //这里发生了向上转型,父类 父类对象 = 子类对象。
Student stu_s = (Student)stu; //这里又发生了向下转型
stu_s.test(); //转型完后才可以调用子类中的test方法,没有转型是无法调用的。 }
} class Person{
void freeActivi(){
System.out.println("*时间");
} } class Student extends Person{
void freeActivi(){
System.out.println("玩耍");
}
void test(){
System.out.println("test");
}
}
运行结果:
test