本文为读<Java编程思想>后所作的读书笔记, 转载请注明出处
封装, 继承, 和多态是面向对象编程的三大特性, 而多态是其中相对比较难以理解的一种,特此介绍:
假设有两个类A和B,其中A为基类,B为A的子类,两个类都包含一个run()方法:
public class A{
public void run(){System.out.println("A");};
}
public class B extends A{
public void run(){System.out.println("B");}
}
我们可以通过一下方法得到一个B的对象:
A b=new B();
这时执行b.run();会输出什么呢? 很显然,我们期待的是"B",而实际上正确的输出也是"B".
同理,若此时还有一个继承自A的子类C,其中有一个run()方法:
public class C extends A{
public void run(){System.out.println("C");}
}
当我们通过以下方法创建一个C的对象并调用起run()方法:
A c=new C();
c.run();
执行的结果是"C".
这就是多态的作用:分离做什么和怎么做.虽然b和c都调用了相同名字的方法run(),但是JAVA却能够在运行时正确的调用其相应子类的方法,而不是其基类的方法.也就是说:b.run()或者c.run()仅仅是告诉b和c对象要执行一个名字叫run()的方法,但是具体要调用的到底是A,还是B和C中的run()方法实体,编程者无需指定,JAVA会在运行时动态的将正确的run()方法的实体绑定到run()的方法调用.然后就会产生正确的结果.这种绑定方法称作"运行时绑定"或者"动态绑定".
另外,在JAVA中除static和final方法以外其他方法都是动态绑定.由于private方法属于final方法,构造器方法是隐式的static方法,所以这两种方法不具有多态性,当执行上面的例子时,若run()方法是static的或者final的,则输出只会是"A".
任何对域,也就是成员变量的访问都不是多态的,因为访问是在编译期进行的.