您的位置:首页 > 编程语言 > Java开发

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

2015-12-18 11:10 393 查看
首先需要知道绑定、前期绑定、后期绑定三者的概念。

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

  前期绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如: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()

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: