多态的定义
同一个行为发生在不同的对象上,产生不同结果的能力
使用多态的好处
- 易于扩展
- 简化调用
- 可替换
多态存在的前提
- 继承
- 子父类中方法的重写
- 父类引用指向子类对象
代码用例
public class TestPolymorphism {
public static void main(String[] args) {
Animal a_c = new Cat();
a_c.eat();//Override:cat eat!!
a_c.sleep(); Animal.sleep();//static animal sleep
System.out.println(a_c.num);//num in animal
System.out.println(a_c.age);//static age in animal
/**
* 总结:
* 该种方式下的多态,只有非静态成员方法(eat方法),才会调用对应子类(Cat类)重写的方法;其他成员变量等都会调用到父类的内容
*/
// int a=a_c.sleepInCat();//多态的弊端:父类 不能使用子类特有的成员属性和子类特有的成员方法;但可以强转到对应的子类
Cat cat = (Cat) a_c;
int a=cat.sleepInCat();//Overloading:cat sleep!! have return
System.out.println(cat.num);//num in cat!
}
}
class Animal {
String num = "num in animal";
static String age = "static age in animal";
public void eat() {//当子类与父类同名方法返回值不一样时,不会构成重写(Override)
System.out.println("animal eat");
}
public static Integer sleep() {
System.out.println("static animal sleep");
return 1;
}
}
class Cat extends Animal {
String num = "num in cat!";
static String age = "static age in cat!";
@Override
public void eat() {//当子类与父类同名方法返回值不一样时,不会构成重写(Override)
System.out.println("Override:cat eat!!");
}
public static Integer sleep() {//当两个同名方法仅仅只是返回类型不同时,不会构成重载(Overloading)
System.out.println("static cat sleep!");
return 1;
}
/*----------------------------------------------------------------------------------------------*/
public String sleepInCat(int a) {//当两个相同方法仅仅只是返回类型不同时,不会构成重载(Overloading)
System.out.println("Overloading:cat sleep!! have return");
return "s";
}
public int sleepInCat(/*int a*/) {//当两个相同方法仅仅只是返回类型不同时,不会构成重载(Overloading)
System.out.println("Overloading:cat sleep!! have return");
return 1;
}
}
- 注意重载(Overloading)与重写(Override)的区别 可参考
- 父类中的静态方法或静态成员变量,不会调用到子类,因为不实列化也可以调用。