Java多态有多种表现形式
-
普通类的多态
-
抽象类的多态
-
接口的多态
但是必须要存在继承关系
有自上而下转型或者自下而上转型,而自下而上转型是自动的
比如我们创建一个父亲类然后两个子类,一个儿子类一个女儿类,儿子类和女儿类同时继承的父类的eat方法,而儿子类存在自己单独的跑步方法。
package ManyT;
public class Test {
public static void main(String[] args) {
Father father = new Son();
Father father1 = new Daughter();
Son son =(Son) new Father();
father.eat();
father1.eat();
son.run();
}
}
class Father {
void eat(){
System.out.println("父亲吃肉");
}
}
class Son extends Father{
@Override
void eat() {
System.out.println("儿子吃白菜");
}
void run(){
System.out.println("儿子再跑");
}
}
class Daughter extends Father{
@Override
void eat() {
System.out.println("女儿吃萝卜");
}
}
自下向上转型
首先定义方法为
父类类型 [父类变量名] = new 子类类型();
此时这个父类变量名字可以调用子类的方法。
注意:如果父类中的方法是静态的(static),子类中的同名方法也是静态的(static),多态调用的依然是父类的成员方法。原因:静态属于类,不属于对象;多态性是针对对象而言的,和静态无关。所以用父类的引用 调用静态方法必然是执行父类的方法。)
Father father = new Son();
father.eat();
此时输出儿子在吃
自上向下转型
定义方法为
子类类型 [子类变量名] = (子类类型) new 父类类型();
此时可以调用该子类单独的方法
Son son = (Son) new Father();
son.run();
此时调用son独有的方法输出儿子在跑。