个人感悟 动态绑定与静态绑定

来源:互联网 发布:fedora linux镜像下载 编辑:程序博客网 时间:2024/06/16 12:03
    今天在看动态代理的时候底层运用到了反射,想这可以把反射看一下,看着看着看到了静态和动态绑定,这个东西老早以前做过笔记研究,不过现在给忘了,又花了点时间研究了以下,现做个笔记。    动态绑定生于子类对象指向父类对象,即向上转型,这个东西仅仅局限于方法,局限与方法,这个是范围,属性都属于静态绑定,这个要分清楚     静态绑定和动态绑定这个怎么区分我就不说了,那个网上太多了,自己去查,这里主要讲    动态绑定     只要父类方法不是被private,static,finally修饰,别的都是动态绑定,当然父类的构造方法也是静态绑定。     

对于private修饰的方法,它不能被继承,只能通过这个类自身的对象来调用。

final方法虽然可以被继承,但不能被重写(覆盖),虽然子类对象可以调用,但是调用的都是父类中所定义的那个final方法。

static方法可以被子类继承,但是不能被子类重写,父类和子类就这一个方法体,那调用的也就只有父类一个了,总不会是别的了。

    对于别的方法调用就是动态绑定了,看这个歌对象具体是那个什么,然后就调用什的方法。
public class test{        public static void main(String[] args) {          String str = new String();          FaCaller caller = new SubCaller();  //子类对象指向父类对象,即向上转型          System.out.println(caller.name);  //静态绑定          caller.call(str);                 //动态绑定          //Fa                                输出          //a String instance in SubCaller    输出    }      static class FaCaller {         public String name="Fa";          public void call(String str) {              System.out.println("a String instance in Caller");          }          public static void callOne(String str) {              System.out.println("a String instance in Caller");          }      }      static class SubCaller extends FaCaller {          public String name="Son";          private void syso() {              this.callOne("hello");//可以看出继承的父类方法        }          @Override          public void call(String str) {              System.out.println("a String instance in SubCaller")`          }      }}
就向上面的 son对象指向fa,调用的属性都是fa的,这个就是静态绑定,java在编译的时候会将son对象当作fa去编译,但是在运行的时候就会判别出是son对象,从而调用子类的方法,这个即为动态绑定。    得益于动态绑定,才有了java的多态和修饰设计模式。
原创粉丝点击