欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

挑战一道Java基础的面试题

程序员文章站 2022-03-11 09:27:04
最近面试了一些应聘者,错误率最高的就是这道Java基础题了,大家一起看看吧。题目是这样设计的:父类有一个方法,子类重写了该方法;那么使用多态调用该方法时,调用的是父类的还是子类的?父类有一个属性,子类也定义了这个属性;那么使用多态调用该属性时,调用的是父类的还是子类的?先看第一个,如下public class Father { public void method(){ System.out.println("father..."); }}//子类重写了父...

最近面试了一些应聘者,错误率最高的就是这道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绑定起来了,因此与后续的继承、重写属性没有任何关系(严格的讲,属性不能叫“重写”,只是子类重新定义了一份)。

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

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

记得关注我!
挑战一道Java基础的面试题

本文地址:https://blog.csdn.net/weixin_49527334/article/details/110432708