java的前期绑定和后期绑定使用示例

首先需要知道绑定、前期绑定、后期绑定三者的概念。

    绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。

  前期绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。

  后期绑定:在运行时根据具体对象的类型进行绑定。

  在了解了三者的概念之后,很明显我们发现java属于后期绑定。在java中,几乎所有的方法都是后期绑定的,在运行时动态绑定方法属于子类还是基类。但是也有特殊,针对static方法和final方法由于不能被继承,因此在编译时就可以确定他们的值,他们是属于前期绑定的。特别说明的一点是,private声明的方法和成员变量不能被子类继承,所有的private方法都被隐式的指定为final的(由此我们也可以知道:将方法声明为final类型的一是为了防止方法被覆盖,二是为了有效的关闭java中的动态绑定)。java中的后期绑定是有JVM来实现的,我们不用去显式的声明它,而C++则不同,必须明确的声明某个方法具备后期绑定。


java的前期绑定在程序执行前根据编译时类型绑定,调用开销较小,如C语言只有前期绑定这种方法调用后期绑定,是指在运行时根据对象的类型进行绑定,又叫动态绑定或运行时绑定。

实现后期绑定,需要某种机制支持,以便在运行时能判断对象的类型,调用开销比前期绑定大。

Java中的static方法和final方法属于前期绑定,子类无法重写final方法,成员变量(包括静态及非静态)也属于前期绑定。除了static方法和final方法(private属于final方法)之外的其他方法属于后期绑定,运行时能判断对象的类型进行绑定。验证程序如下:


class Base
{
    //成员变量,子类也有同样的成员变量名
    public String test="Base Field";
    //静态方法,子类也有同样签名的静态方法
    public static void staticMethod()
    {
        System.out.println("Base staticMethod()");
    }
    //子类将对此方法进行覆盖
    public void notStaticMethod()
    {
        System.out.println("Base notStaticMethod()");
    }

}
public class Derive extends Base
{
    public String test="Derive Field";
    public static void staticMethod()
    {
        System.out.println("Derive staticMethod()");
    }
    @Override
    public void notStaticMethod()
    {
        System.out.println("Derive notStaticMethod()");
    }
    //输出成员变量的值,验证其为前期绑定。
    public static void testFieldBind(Base base)
    {
        System.out.println(base.test);
    }
    //静态方法,验证其为前期绑定。
    public static void testStaticMethodBind(Base base)
    {
        //The static method test() from the type Base should be accessed in a static way
        //使用Base.test()更加合理,这里为了更为直观的展示前期绑定才使用这种表示。
        base.staticMethod();
    }
    //调用非静态方法,验证其为后期绑定。
    public static void testNotStaticMethodBind(Base base)
    {
        base.notStaticMethod();
    }
    public static void main(String[] args)
    {
        Derive d=new Derive();
        testFieldBind(d);
        testStaticMethodBind(d);
        testNotStaticMethodBind(d);
    }
}
/*程序输出:
Base Field
Base staticMethod()
Derive notStaticMethod()
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值