1、前提条件:类与类之间必须有父子类关系
2、多态中成员的特点
①多态成员 变量:编译运行看左边
Fu f=new Zi();
System.out.println(f.num); //f是Fu中的值,只能取到父类中的值
②多态成员 方法:编译看左边,运行看右边
Fu f1=new Zi();
System.out.println(f1.show()); //f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
3、向上向下转型详解
public class demo {
public static void main(String[] arg) {
/**
* 向上转型
* 多态本身就是向上转型过的过程
* 使用格式:父类类型 变量名=new 子类类型();
* 使用注意:变量名只能调用父类有的方法,不能调用子类特有的方法;
* 子类父类有相同的属性,不同的数值时,变量名只能获得父类的属性值,不能获得子类的属性值
* 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
*/
People p = new Student(); //表面上是父类,实际上是子类,就是儿子穿上父亲的衣服,假装是父亲
System.out.println(p.hand); //2
System.out.println(p.leg); //2
// System.out.println(p.nose); //报错,不能获取子类的属性
p.eat(); //去食堂吃午餐
p.play(); //打球
// p.study(); //报错,父类没有study()方法,对象p只能调用父类有的方法,不能调用study()
/**
* 向下转型 需要强制性转型
* 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
* 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
* 使用注意:变量名表面和内在都是子类,子类特有的方法、重写父类的方法、父类的方法都可以调用;
* 子类父类有相同的属性,不同的数值时,变量名只能获得子类的属性值;
* 子类有特有的属性时,能获得特有的属性的值
* 适用场景:当要使用子类特有功能时。
*/
Student s = (Student) p; //儿子现在脱下了父亲的衣服,重新当回儿子
System.out.println(s.hand); //4
System.out.println(s.leg); //4
System.out.println(s.nose); //2
s.eat(); //去食堂吃午餐
s.play(); //打球
s.study(); //上课学习知识
}
}
class People{
public int hand=2;
public int leg=2;
public void eat() {
System.out.println("吃肉");
}
public void play() {
System.out.println("打球");
}
}
class Student extends People{
public int hand=4;
public int leg=4;
public int nose=2;
@Override
public void eat() {
System.out.println("去食堂吃午餐");
}
public void study() {
System.out.println("上课学习知识");
}
}