多态指同一个方法,由不同对象调用可能会有**不同的行为。**就像我们的学习生活中,同样是学习,幼儿园学“1+1”,小学学“列竖式”,高中学“方程”,大学学“技术”…
这就是同样都是学习方法,然后执行的不同。
多态的要点:
1. 多态是方法的多态,不是属性的多态(多态与属性无关)。
2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
public class TestDuotai {
public static void main(String[] args) {
Students s=new Students();
s.name="小小志";
s.study();
Students y1=new Youeryuan();//自动向上转型,但是还是调用Youeryuan的方法,本质还是Youeryuan,但在编译时是Studens
Xiaoxue x1=new Xiaoxue();
y1.name="小小心";
y1.study();
//y1.wansuan 编译不通过,在编译时y1是Stdends 没有玩耍的方法
// Youeryuan y2=(Youeryuan)s;//依旧是编译通过但是运行报错
//s.study();也是编译通过 但是运行报错
//y2.wansuan();//虽然编译通过了,但是仍然不能执行,因为s本身是Students
Xiaoxue x=(Xiaoxue)y1;//编译通过,但是还是不能运行 y1本质是Youeryuan,强制转型成Xiaoxue,但是计算器没有那么高智能
x.study();//同上
//Youeryuan yx=(Youeryuan)x1;不能这样写,编译就报错了
}
}
class Students{
int age;
String name;
public void study(){
System.out.println(name+"学习ing");
}
}
class Youeryuan extends Students{
@Override
public void study() {
super.study();
System.out.println(name+"学唱歌跳舞");
}
public void wansuan(){
System.out.println("玩滑滑梯");
}
}
class Xiaoxue extends Students{
public void study(){
System.out.println(name+"学小学知识");
}
}