面试题-JAVA静态绑定和动态绑定

面试题:

一个Java程序的执行要经过编译和运行这两个步骤,同时Java又是面向对象的编程语言。当子类父类存在同一个方法,子类重写了父类的方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢?

涉及的知识点:

  • 1、程序绑定的概念:
    通俗的讲绑定就是指你调用的方法是绑定在哪个类上的。
    例如:父类 Father 有 方法 run();
    子类 Son 也有方法 run();
    那么你调用的是哪个类的方法?
  • 2、静态绑定:
    针对java简单的可以理解为程序编译期的绑定(编译为.class文件的过程中就完成了绑定)
    java当中的方法被final、static、private修饰的和构造方法必然是静态绑定。
  • 3、动态绑定:
    定义:在程序运行时根据具体对象的类型进行绑定。
  • 4、关于被final、static、private修饰的方法和构造方法是静态绑定的理解
    private:
    被private修饰的类不能被继承。
    final:
    final方法虽然可以被继承,但不能被重写(覆盖),虽然子类对象可以调用,但是调用的都是父类中所定义的那个final方法。
    static:
    static方法可以被子类继承,但是不能被子类重写(覆盖),但是可以被子类隐藏。
    (这里意思是说如果父类里有一个static方法,它的子类里如果没有对应的方法,那么当子类对象调用这个方法时就会使用父类中的方法。
    而如果子类中定义了相同的方法,则会调用子类的中定义的方法。
    唯一的不同就是,当子类对象向上转型为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法。因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类中的成员变量是一样的。
    隐藏和覆盖的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏的变量和方法,而不能访问父类被覆盖的方法)
    构造方法:
    构造方法也是不能被继承的(网上也有说子类无条件地继承父类的无参数构造函数作为自己的构造函数,不过个人认为这个说法不太恰当,因为我们知道子类是通过super()来调用父类的无参构造方法,来完成对父类的初始化, 而我们使用从父类继承过来的方法是不用这样做的,因此不应该说子类继承了父类的构造方法),因此编译时也可以知道这个构造方法到底是属于哪个类。

猜你喜欢

转载自blog.csdn.net/peanutwzk/article/details/104425598