java——重载解析、静态绑定、动态绑定

重载解析:

  a被声明为A类型的对象,调用method()方法时,如果有多个同名方法,参数不同,编译器将列举所用类A的method()方法和所用父类中public类型的method()方法,编译器查看这些方法的参数列表,选择完全匹配的,调用该方法。

静态绑定(编译时绑定):

  当程序的方法运行采用静态绑定,虚拟机一定调用对象的实际类型最合适的类的方法。

动态绑定(运行时绑定):

  所有父类类型的引用可以调用父类的所有(这里和静态绑定不同)属性和方法,但是子类定义而父类没有定义的方法是不可以调用的(这里也不同)

public class exp {
    public static void main(String[] args) {
        BaseClass sub = new SubClass();
        sub.method1();//baseclass method1
        sub.method3();//subclass method3    
        // sub.method2();//报错:The method method2() is undefined for the type BaseClass
        System.out.println();
        
        SubClass sub2 = new SubClass();
        sub2.method1();//baseclass method1
        sub2.method2();//subclass method2
        sub2.method3();//subclass method3
    }
}    
class BaseClass{
    public void method1() {
        System.out.println("baseclass method1");
    }
    public void method3() {
        System.out.println("baseclass method3");
    }
}
class SubClass extends BaseClass{
    public void method2() {
        System.out.println("subclass method2");
    }
    public void method3() {
        System.out.println("subclass method3");
    }
}
    

  从这个例子可以看出,使用父类类型的引用指向子类的对象时,该引用只能调用父类中已经定义的方法和变量,子类中新创建的方法不能用。如果子类重载父类方法,该引用调用的就是子类的方法。

  这样来看,好像静态绑定就是这种:

Dog dog = new Dog();

  而动态绑定就是这种:

Animal a = new Dog();

  emmm, 目前来看我是这样理解的。

 

posted @ 2018-09-24 16:26  高圈圈  阅读(247)  评论(0编辑  收藏  举报