对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
多态的3个必要条件:
1.继承 2.重写 3.父类引用指向子类对象。
多态的规则
1.当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
2.如果有,再去调用子类的该同名方法。
注意此处:静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。
3. 如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如下面的例子中,将animal_01转换为子类cat类型的引用。因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。
注意:向上类型的转换是自动的,向下类的转换不是自动的,需要程序员手动进行转化。
代码如下:
运行结果:
代码如下:
点击(此处)折叠或打开
-
package com;
-
-
public class Polymorphic {
-
-
/**
-
* @param args
-
*/
-
public static void main(String[] args) {
-
// TODO Auto-generated method stub
-
-
//向上类型的自动转换
-
Dog dog = new Dog();
-
Animal animal = null;
-
animal = dog;
-
animal.eat();
-
-
-
//向下类型转换
-
Animal animal_01 = new Cat();
-
Cat cat = (Cat)animal_01;
-
cat.eat();
-
cat.CatMouse();
-
-
//用父类引用调用父类不存在的方法,会编译出错,向下类型转化是是强制进行;
-
// Animal animal_02 = new Cat();
-
// animal_02.CatMouse();
-
-
//Pig类没有重写父类的方法,因此调用时调用的都是父类的方法
-
Pig pig = new Pig();
-
pig.eat();
-
-
}
-
-
}
-
-
class Animal
-
{
-
public void eat()
-
{
-
System.out.println("all animals have the The act of eating");
-
}
-
}
-
class Dog extends Animal
-
{
-
public void eat()
-
{
-
System.out.println("Dog eats meat");
-
}
-
}
-
-
class Cat extends Animal
-
{
-
public void eat()
-
{
-
System.out.println("Cat eats mouse");
-
}
-
public void CatMouse()
-
{
-
System.out.println("cat can catch mouse");
-
}
-
}
-
- class Pig extends Animal{}
点击(此处)折叠或打开
-
Dog eats meat
-
Cat eats mouse
-
cat can catch mouse
- all animals have the The act of eating