1,第一要理解这句话要知道方法覆盖与方法重载,这个我在另外一篇博文中写了
2,第二是要理解什么是多态。多态(Polymorphism)属于面向对象三大特征之一,它的前提是封装形成独立体,独立体之间存在继承关系,从而产生多态机制。多态是同一个行为具有多个不同表现形式或形态的能力。
举例1:注意以下代码放入不同类中,这个例子中,cat和bird都有move,就是将父类animal中的move覆盖了,这就是方法重写(方法覆盖),两者虽然都是move,但是表现结果不同,这就是多态。
public class Animal {
public void move() {
System.out.println("Animal move!");
}
}
public class Cat extends Animal{
//方法覆盖
public void move(){
System.out.println("走猫步!");
} //子类特有
public void catchMouse(){
System.out.println("抓老鼠!");
}
}
public class Bird extends Animal{
//方法覆盖
public void move(){
System.out.println("鸟儿在飞翔!");
}
//子类特有
public void sing(){
System.out.println("鸟儿在歌唱!");
}
}
public class Test01 {
public static void main(String[] args) {
//创建Animal对象
Animal a = new Animal();
a.move();
//创建Cat对象
Cat c = new Cat(); c.move();
//创建鸟儿对象
Bird b = new Bird();
b.move();
}
例二:注意,要导包。这个就是父类引用指向子类对象。
package testPoly2;
import testPoly.Animal;
import testPoly.Bird;
import testPoly.Cat
public class Test02 {
public static void main(String[] args) {
Animal a1 = new Cat();
a1.move();
Animal a2 = new Bird();
a2.move();
}
}
3,理解完多态,就开始讲题目那句话了。
Animal a1 = new Cat();
a1.move();
首先Java程序包括编译和运行两个阶段。在编译阶段,a1引用去父类Animal.class字节码中寻找对应的move()方法,找到之后进行绑定,称之为‘静态绑定’。在实际运行阶段,发现引用a1实际上指向Cat类,这时使用Cat中的方法,称之为动态绑定。但是,无论什么时候,都必须先静态绑定,然后动态绑定。
4,下面是几个延伸知识点
延伸一:使用子类中独有的。如果没有这一句向下转型,就会报错,因为父类引用不能直接调用子类中独有的方法
public class Test03 {
public static void main(String[] args) {
Animal a = new Cat();
//注意,如果没有下面这一句向下转型,就会报错,因为父类引用不能直接调用子类中独有的方法
Cat c=(Cat)a;
c.catchMouse();
}
}
延伸二:使用父类中独有的方法
父类引用可以使用父类中有而子类中没有的功能,如果讲父类中加上一个eat()功能,如果使用4中的a去调用,这时会输出父类中的方法。
延伸三:如果父类Animal引用指向子类对象Cat,此时向下强转为Bird,是否可以使用Bird中的方法?不可以
public class Test03 {
public static void main(String[] args) {
Animal a = new Cat();
//注意,如果没有下面这一句向下转型,就会报错,因为父类引用不能直接调用子类中独有的方法
//Bird c=(Bird)a;ClassCastException
//c.sing();
Cat c=(Cat) a;
c.catchMouse();
}
}
总结:多态的三个条件:继承,方法覆盖,父类引用指向子类对象。