“封装”通过合并特征和行为来创建新的数据类型。
“多态”的作用则是消除类型之间的耦合关系。
定义:将一个方法调用同一个方法主题关联起来被称为绑定。
若在程序执行前进行绑定(假设有的话,由编译器和链接程序实现),叫前期绑定。在执行时依据对象的类型进行绑定称为后期绑定,或执行时绑定。java中的多态就是通过动态绑定实现的。
java中除了static方法和final方法(private 方法属于final方法)之外,其它全部方法都是后期绑定。
一旦你了解了多态机制,你可能会觉得全部事物都是能够多态的发生的。然而,仅仅有普通的方法调用是能够多态的。假设你訪问某个域field,这个訪问将在编译期进行解析。看以下的样例:
class Super{ public int filed = 0; public int getFiled(){ return filed; } } class Sub extends Super{ public int filed = 1; public int getFiled(){ return filed; } public int getSuperFiled(){ return super.filed; } } public class FiledAccess { public static void main(String [] agrs){ Super sup = new Sub(); System.out.println("sup.field = " + sup.filed + ", sup.getField() = "+ sup.getFiled()); Sub sub = new Sub(); System.out.println("sub.field = " + sub.filed + ", sub.getField() = "+ sub.getFiled() + ", sub.getSuperField() = " + sub.getSuperFiled()); } } sup.field = 0, sup.getField() = 1 sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
这个问题看起来非常easy令人混淆,可是实际中却并不常发生。由于依据设计原则,我们经常将全部的域设置为private的,因此不能直接訪问他们,仅仅能通过方法来訪问。
总结:方法多态,域不多态訪问。
静态方法相同不具有多态性。由于静态方法是与类相关联的,而不是与单个对象相关联。看以下的样例消化一下^.^~:
class StaticSuper{ public static String staticGet(){ return "Base staticGet()"; } public String dynamicGet(){ return "Base dynamicGet()"; } } class StaticSub extends StaticSuper{ public static String staticGet(){ return "Derived staticGet()"; } public String dynamicGet(){ return "Derived dynamicGet()"; } } public class StaticPolymorphism { public static void main(String [] args){ StaticSuper sup = new StaticSub(); System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); } } output: Base staticGet() Derived dynamicGet()
原文:http://www.cnblogs.com/gcczhongduan/p/4296607.html