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

java 上溯造型(向上转型)和动态绑定

2015-05-28 20:20 281 查看
/*
* 理解什么叫 “向上转型”
* 定义一个子类Cat,它继承至Animal类,现在这样定义: Animal a = new Cat();这代表什么意思呢?
* 解释:首先我们定义了一个Animal类型的引用a,指向了新new出来的一个实例Cat对象,由于Cat是继承至它的父类
* Animal,所以Animal类型的引用是可以指向Cat类型的对象的。
*
* 那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的; 同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。也可以叫做动态绑定。

*/

class Father {
public String str = "a";
public void function1() {
function2();
}
// 这是父类中的function2()方法,因为下面的子类中重写了该方法 ,所以在父类类型的引用中调用时,这个方法将不再有效,
// 取而代之的是将调用子类中重写的func2()方法
public void function2() {
System.out.println("AAA");
}

}

class Child extends Father {
public String str = "b"; //重写了父类的变量str,这样做是无效的
//	function1(int i)是对function1()方法的一个重载
//	由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用
public void function1(int i) {
System.out.println("BBB");
}

//	function2()重写了父类Father中的function2()方法 如果父类类型的引用中调用了function2()方法,那么必然是子类中重写的这个方法
public void function2() {
System.out.println("CCC");
}
}

public class Test1 {

public static void main(String[] args) {
Father child = new Child();
child.function1(); //打印 CCC
//	child.function1(22); 这段代码会报错,因为父类中没有这个方法,这个方法是子类独有的,所以父类的引用没法使用
System.out.println(child.str); //输出 a
}

}

总结:

1:使用父类类型的引用指向子类的对象

2:该引用只能调用父类中定义的方法和变量

3:如果子类重写了父类的方法,那么在调用该方法时,将会调用子类里面这个重写的方法(动态连接,动态调用)

4:变量不能被重写(覆盖),重写只针对于方法,

我们再来看看上面讲的动态连接,也就是动态绑定到底是什么一回事

程序绑定的概念:

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.

静态绑定:

在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。例如:C。

针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定

动态绑定:

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

若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。

动态绑定的过程:

(1)虚拟机提取对象的实际类型的方法表;
(2)虚拟机搜索方法签名;
(3)调用方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: