? 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.
? 在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由 编译器或其它连接程序实现。针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定。
? private:不能被继承,则不能通过子类对象调用,而只能通过类本身的对象进行调用,所以可以说private方法是和方法所属的类进行绑定;
? final:可以被继承,但是不能被重写(覆盖),虽然子类对象可以调用,但是调用的都是父类中的final方法(因此可以看出当类中的方法声明为final的时候,一方面可以防止方法被覆盖,一方面有效关闭java的动态绑定,在程序编译的时候就会绑定起来)(想到final突然想到了String就是使用final修饰的,那么我们都知道他引用的对象值是不能进行修改的,当然,有些时候String类型的值进行了改变,本质不是修改的对象本身,而是引用关系);
? static:可以被子类继承,但是不能被子类重写(覆盖),
? 在运行时根据具体对象的类型进行绑定。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说, 编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。
动态绑定的过程分为以下几个环节:
(1)编译器查看对象的声明类型和方法名;
(2)编译器查看调用方法时提供的参数类型。例如x.f("hello")(x:类名;f:方法名,下同),编译器将会挑选f(String),而不是f(int),不过存在类型转换(int可以转换成double,Manager可以转换成Employee,等等)。如果编译器没找到参数类型匹配的方法,或者发现有多个方法与之匹配,就会报告一个错误。
至此,编译器获得了需要调用的方法名字和参数类型。
(3)采用动态绑定调用方法的时候,一定调用与所引用对象的实际类型最合适的类的方法。如果x的实际类型是D,它是c类的子类,如果c定义了一个方法f(String),就直接调用它,否则将在D类的超类(父类)即c类中寻找f(String),以此类推。
注:
调用顺序:父类静态,子类静态,父类非静态,父类构造,子类非静态,子类构造
原文:https://www.cnblogs.com/tranprimit/p/14641503.html