编程思想-多态

在面向对象程序设计语言中,封装,继承,多态是基本的三大特征。“封装”通过合并特征和行为来创建新的数据类型。多态的作用则是消除类型之间的耦合关系

多态-动态绑定
*what is Early and Late Binding?(来自stackoverflow)。
The short answer is that early (or static) binding refers to compile time binding and late (or dynamic) binding refers to runtime binding (for example when you use reflection)——byChristian Hagelid.*

绑定:将一个方法调用同一个方法主体关联起来。
前期绑定:在程序执行前进行绑定(编译器)
后期绑定:在程序运行时根据对象的类型进行绑定。

Java中除了static方法和final方法(private 方法属于final方法)之外,其他所有方法都是后期绑定。这就意味着通常情况下,我们不必判定是否应该进行后期绑定-它会自动发生。

  • final方法:可以防止其他人覆盖该方法。可以有效的”关闭”动态绑定,这样编译器就可以为final方法生成更有效的代码。不过不要通过使用final方法来企图提高性能
  • 缺陷:“覆盖”私有方法
public class Father {
    private void show(){
        System.out.println("Father");
    }
    public static void main(String[] args) {
        Father father = new Son();
        father.show();  
    }
}
class Son extends Father{
    public void show(){
        System.out.println("Son");
    }
}
ouput:Father

结论:只有非private方法可以覆盖

  • 缺陷:域与静态方法
    public class Father {
    public int age = 40 ;

    public int getAge(){return age;}

    public static void main(String[] args) {
    Father fa = new Son();
    System.out.println(“fa.age=”+fa.age+” fa.getAge()=”+fa.getAge());
    Son son = new Son();
    System.out.println(“son.age=”+son.age+” son.getAge()=”+son.getAge());
    }
    }
    class Son extends Father{
    public int age = 12 ;
    public int getAge(){
    return age;
    }
    }
    output:fa.age=40 fa.getAge()=12
    son.age=12 son.getAge()=12
    总结:Son对象转化成Father引用时,任何域访问操作都将有编译器解析,因此不是多态。在本例中Son.age和Father.age分配了不同的存储空间

public class Father {
    public static  void show(){
        System.out.println("Father");
    }

    public static void main(String[] args) {
        Father father = new Son();
        father.show();  
    }
}
class Son extends Father{   
    public static void show(){
        System.out.println("Son");
    }

}
答案:Father

总结:如果某个方法为静态,它的行为就不具备多态性。因为静态方法是与类而不是与单个对象关联。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值