绑定:是指一个方法的调用与方法所在的类(主题方法相绑定);
静态绑定:程序运行前方法已经被绑定。编译期进行绑定;
动态绑定:程序运行时根据具体对象类型进行绑定;
Java:编译和运行
(1)在编译期间,程序会编译成class文件,会对其中的方法和域会根类信息进行一次绑定;
(2)在运行期间,方法会根据运行时对象信息进行第二次的绑定(动态绑定),也就是长说的 多态;
举例:
class A{ int x = 10; public void out(){ System.out.println("A out put!"); } } class B extends A{ int x =11; public void out(){ System.out.println("B out put!"); } } public class Test { public static void main(String[] args) { A a = new B(); //B a = new B(); System.out.println(a.x); a.out(); } }
最终的输出:
10
B out put!
如果改成:
public class Test { public static void main(String[] args) { //A a = new B(); B a = new B(); System.out.println(a.x); a.out(); } }
最终的输出就是:
11
B out put!
原因:
B 继承 A
在编译阶段;x 会加载到A 和 B中;属于静态加载;
在运行阶段:A a = new B(); B 重写了A中的out()方法,x属于成员变量,A 和 B都存在,但是成员函数不会存在重写一说,父类的成员函数会被隐藏,不能被简单的被访问,父类自己的引用可以访问,所以A a = new B()访问的是父类的x,而B b = new B()访问的是B中的x;
动态记载加载会根据运行时数据动态绑定方法,out重写了,所以绑定了B中的out方法;