常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
来源:互联网 发布:declaration在c语言中 编辑:程序博客网 时间:2024/05/16 07:37
ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一。你可以从这里查看全部的Java面试系列。
这篇文章介绍的常见面试题是关于重载(overloading)方法和重写(overriding)方法的。
Q.下面代码片段的输出结果是什么?
public
class
MethodOverrideVsOverload {
public
boolean
equals( MethodOverrideVsOverload other ) {
System.out.println(
"MethodOverrideVsOverload equals method reached"
);
return
true
;
}
public
static
void
main(String[] args) {
Object o1 =
new
MethodOverrideVsOverload();
Object o2 =
new
MethodOverrideVsOverload();
MethodOverrideVsOverload o3 =
new
MethodOverrideVsOverload();
MethodOverrideVsOverload o4 =
new
MethodOverrideVsOverload();
if
(o1.equals(o2)){
System.out.println(
"objects o1 and o2 are equal"
);
}
if
(o3.equals(o4)){
System.out.println(
"objects o3 and o4 are equal"
);
}
}
}
A.输出结果是:
MethodOverrideVsOverload equals method reached
objects o3 and o4 are equal
这个问题考察了哪些概念呢?
- Java语言中,一个类只能从一个类中继承出来(也就是,单继承结构),如果没有显式的标明所继承自的类,那么自动继承自Object对象。
- 大多数的非final对象类方法都会被子类重写(overridden):
public boolean equals(Object obj); // make note of this method
public int hashCode();
public String toString();
- 重载方法在编译时起作用(例如,静态绑定),重写方法在运行时起作用(例如,动态绑定)。静态绑定意味着JVM在编译时决定调用的类或方法。而动态绑定时,JVM是在运行时决定调用的类或方法。动态绑定设计是多态的基础。更多了解编译时和运行时.
- 子类中重写父类的对应方法必须遵循下面的规则:
现在,再回头看上面的代码,MethodOverrideVsOverload 类中的”equals(MethodOverrideVsOverload other)” 方法并没有重写Object类中的”public boolean equals(Object obj)” 方法。这是因为其违背了参数规则,其中一个是MethodOverrideVsOverload 类型,而另一个是Object类型。因此,这两个方法是重载关系(发生在编译时),而不是重写关系。
因此,当调用o1.equals(o2)时,实际上调用了object类中的public boolean equals(Object obj)方法。这是因为在编译时,o1和o2都是Object类型,而Object类的equals( … )方法是比较内存地址(例如,Object@235f56和Object@653af32)的,因此会返回false。
当调用o3.equals(o4)时,实际上调用了MethodOverrideVsOverload 类中的equals( MethodOverrideVsOverload other )方法。这是因为在编译时,o3和o4都是MethodOverrideVsOverload类型的,因此得到上述结果。
接下来还可以怎么提问呢?
Q.那怎么解决上面的那个问题呢?
A.在Java5中,新增了注解,其中包括很好用的编译时注解(compile time annotations)@override,来保证方法正确的重写了父类方法。如果在上面的代码中添加了注解,那么JVM会抛出一个编译错误。
因此,解决的方法就是给MethodOverrideVsOverload 类的boolean equals( MethodOverrideVsOverload other )方法添加@override注解。这样的话编译时就会有错误抛出来提示开发者某个方法没有正确的重写父类方法。之后,还需要修改方法的参数,将其从MethodOverrideVsOverload变成Object,具体如下:
public
class
MethodOverrideVsOverload {
@Override
public
boolean
equals( Object other ) {
System.out.println(
"MethodOverrideVsOverload equals method reached"
);
return
true
;
}
public
static
void
main(String[] args) {
Object o1 =
new
MethodOverrideVsOverload();
//during compile time o1 is of type Object
//during runtime o1 is of type MethodOverrideVsOverload
Object o2 =
new
MethodOverrideVsOverload();
//during compile time o2 is of type Object
//during runtime o2 is of type MethodOverrideVsOverload
MethodOverrideVsOverload o3 =
new
MethodOverrideVsOverload();
//o3 is of type MethodOverrideVsOverload
// during both compile time and runtime
MethodOverrideVsOverload o4 =
new
MethodOverrideVsOverload();
//o4 is of type MethodOverrideVsOverload
// during both compile time and runtime
if
(o1.equals(o2)){
System.out.println(
"objects o1 and o2 are equal"
);
}
if
(o3.equals(o4)){
System.out.println(
"objects o3 and o4 are equal"
);
}
}
}
输出为:
MethodOverrideVsOverload equals method reached
objects o1 and o2 are equal
MethodOverrideVsOverload equals method reached
objects o3 and o4 are equal
上面的代码中,运行时equals方法正确的重写了Object中的相应方法。这是一个比较容易混淆的问题,面试的时候需要很详尽的解释相关的概念。
扩展阅读:
- 常见Java面试题 – 第一部分:非可变性(Immutability)和对象引用(Object reference)
- 常见Java面试题 – 第二部分:equals与==
- 常见Java面试题 – 第四部分:迭代(iteration)和递归(recursion)
英文原文: Java Success,编译:ImportNew - 郑雯
译文链接:http://www.importnew.com/2228.html
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- 重载(overloading)与重写(overriding)
- 重载(Overloading)与 重写(Overriding)
- Java中重载(Overloading)与重写(Overriding)的区别
- Java重载overloading与重写(覆盖)overriding
- java中的重载(overriding)跟重写(overloading)理解
- java中重载(Overloading)和重写(Overriding)
- java中方法的重写(overriding)与重载(overloading)的区别
- Java中的方法重写(Overriding)与方法重载(Overloading)
- Java中的方法重写(Overriding)与方法重载(Overloading)
- Java中重载Overloading与重写Overriding的区别
- Java学习笔记之重写(Overriding)与重载(Overloading)
- java中重载Overriding与重写Overloading的区别
- Java方法重载(overloading)与方法重写(overriding)
- 方法的重载(overloading)与重写(overriding)
- 指针与数组 内存分配
- Python基础函数学习笔记(一)
- 什么是音乐的动态,它和播放器推力以及耳机单元有什么关系?
- 发现:Eknigu.com 棒!
- 360随身wifi导致outlook不收发邮件解决办法
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- Java你不知道的那些事儿—Java隐藏特性
- CentOS下安装QT5
- Java性能小技巧
- 不要试图欺骗百度
- C:\WINDOWS\system32\drivers\etc\hosts文件的作用
- 简要记录下编译OGRE 1.9的过程
- AnnotationSessionFactoryBean使用
- 简单计算器