挑战一道Java基础的面试题

最近面试了一些应聘者,错误率最高的就是这道Java基础题了,大家一起看看吧。

题目是这样设计的:

  1. 父类有一个方法,子类重写了该方法;那么使用多态调用该方法时,调用的是父类的还是子类的?
  2. 父类有一个属性,子类也定义了这个属性;那么使用多态调用该属性时,调用的是父类的还是子类的?

先看第一个,如下


public class Father {
   
   
    public void method(){
   
   
        System.out.println("father...");
    }
}
//子类重写了父类的method()
class Son extends  Father{
   
   
    public void method(){
   
   
        System.out.println("son...");
    }
}

class Test{
   
   
    public static void main(String[] args) {
   
   
        Father x = new Son();
        x.method() ;
    }
}

运行结果:son…
(这一问 没什么大问题,大部分人都能答对。考点就是最基本的:方法重写,即子类重写了父类的方法。)

问题出在第二问,如下。


public class Father {
   
   
    String name = "zs" ;
}

class Son extends  Father{
   
   
    String name = "ls" ;
}

class Test{
   
   
    public static void main(String[] args) {
   
   
        Father x = new Son();
        System.out.println(x.name);
    }
}

运行结果:zs
没错,是zs,不是ls

本题的解析如下:

  1. 当子类重写了父类的方法时,调用主体(即代码中的对象“x”)和方法(即代码中的“method()”)是运行时绑定的。也就是说,在编译期间,对象“x”还没有和"method()"方法关联起来,而是在程序运行期间绑定。根据多态“父类引用,指向子类对象”的特性,父类引用"x"在运行时使用了子类对象Son中的method()方法。
  2. 当子类重写了父类的属性时,调用主体(即代码中的对象“x”)和属性(即代码中的“name”)是编译时绑定的。也就是说,在编译期间,父类Father对象已经和属性name绑定起来了,因此与后续的继承、重写属性没有任何关系(严格的讲,属性不能叫“重写”,只是子类重新定义了一份)。

总结一下:在使用多态的时候,重写方法,调用的是子类的方法;重写属性,调用的是父类的属性。

如果喜欢本篇文章,欢迎转发、点赞。

记得关注我!
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章