挑战一道Java基础的面试题
程序员文章站
2022-03-11 09:27:04
最近面试了一些应聘者,错误率最高的就是这道Java基础题了,大家一起看看吧。题目是这样设计的:父类有一个方法,子类重写了该方法;那么使用多态调用该方法时,调用的是父类的还是子类的?父类有一个属性,子类也定义了这个属性;那么使用多态调用该属性时,调用的是父类的还是子类的?先看第一个,如下public class Father { public void method(){ System.out.println("father..."); }}//子类重写了父...
最近面试了一些应聘者,错误率最高的就是这道Java基础题了,大家一起看看吧。
题目是这样设计的:
- 父类有一个方法,子类重写了该方法;那么使用多态调用该方法时,调用的是父类的还是子类的?
- 父类有一个属性,子类也定义了这个属性;那么使用多态调用该属性时,调用的是父类的还是子类的?
先看第一个,如下
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
本题的解析如下:
- 当子类重写了父类的方法时,调用主体(即代码中的对象“x”)和方法(即代码中的“method()”)是运行时绑定的。也就是说,在编译期间,对象“x”还没有和"method()"方法关联起来,而是在程序运行期间绑定。根据多态“父类引用,指向子类对象”的特性,父类引用"x"在运行时使用了子类对象Son中的method()方法。
- 当子类重写了父类的属性时,调用主体(即代码中的对象“x”)和属性(即代码中的“name”)是编译时绑定的。也就是说,在编译期间,父类Father对象已经和属性name绑定起来了,因此与后续的继承、重写属性没有任何关系(严格的讲,属性不能叫“重写”,只是子类重新定义了一份)。
总结一下:在使用多态的时候,重写方法,调用的是子类的方法;重写属性,调用的是父类的属性。
如果喜欢本篇文章,欢迎转发、点赞。
记得关注我!
本文地址:https://blog.csdn.net/weixin_49527334/article/details/110432708
上一篇: 正则限制input输入整数