挑战一道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绑定起来了,因此与后续的继承、重写属性没有任何关系(严格的讲,属性不能叫“重写”,只是子类重新定义了一份)。

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

需要更多大厂面试资料的话也可以点击直接进入,免费获取!暗号:CSDN

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

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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值