`

常见Java面试题(三):重载(overloading)与重写(overriding)

 
阅读更多

这篇文章介绍的常见面试题是关于重载(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是在运行时决定调用的类或方法。动态绑定设计是多态的基础。
  • 子类中重写父类的对应方法必须遵循下面的规则:
参数 不可变(译者注:包括参数类型和个数)。
返回类型 不可变,除了协变返回类型或其子类型(covariant (subtype) returns)。
异常 子类中可以抛出更少的异常,但绝对不能抛出父类中没有定义的已检查异常。
访问权限 比父类中对应方法更宽松。
调用 运行时(也就是动态绑定),根据对象类型来决定调用的具体方法。

现在,再回头看上面的代码,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面试题

     方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和...

    最新最全Java面试题汇总

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。 52、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    java面试葵花宝典

    java面试题大全 40、构造器Constructor是否可被override? 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

    重载与覆写/重写的区别

    重载与覆写/重写的区别 区别 重载 覆写 1 单词 OverLoading Override 2 概念 方法名称相同,参数的类型或个数不同 方法名称相同,参数的类型或个数相 同,返回值类型相同 3 范围 发生在一个类之中...

    java 面试题 总结

    方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数...

    Overloading&Overriding

    Overloading&Overriding两者的区别

    java中重载与重写的区别

    java中重载与重写的区别,方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。

    java 经典面试题 于网络分享

    5. Java语言中,方法的重写(Overriding)和重载(Overloading)是多态性的不同表现。下边哪些说法是对的? A. 重写是父类与子类之间多态性的一种表现。 B. 重写是一个类中多态性的一种表现。 C. 重载是一个类中...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    java面试常见问题(超详细).pdf

    Java中什么是重载【Overloading】?什么是覆盖【Overriding】?它们有什么区别? Java中什么是多态?如何实现多态? Java中什么是接口?它有什么作用? Java中什么是抽象类?它有什么作用? Java中什么是final关键字...

    Java面试宝典(基础篇).docx

    1.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思? 重写和重载的区别? 答: Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类...

    Interactive.Object.Oriented.Programming.in.Java

    This book uses Java and Eclipse to write and generate output for examples in topics such as classes, interfaces, overloading, and overriding. Interactive Object Oriented Programming in Java uniquely ...

    Java SE 基础知识题库

    java中实现多态的机制是什么?...方法的重写Overriding和重载Overloading是Java多态性的不同表现。 重写(Overriding)是父类与子类之间多态性的一种表现; 重载(Overloading)是一个类中多态性的一种表现。

    Java 实例 - 重载(overloading)方法中使用 Varargs技术包含源代码和详细教程.zip

    Java 实例 - 重载(overloading)方法中使用 Varargs技术包含源代码和详细教程.zip

    PHP面相对象中的重载与重写

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。Overloaded的方法是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。 重载(Overloading) a、...

    coreJava240问与答面试题

    240-core-java-interview-questions-and-answers,coreJava240问与答面试题. 不过是英文的哦,想下载的朋友要注意了。1) what are static blocks and static initalizers in Java ? ...................................

    JAVA重载概念

    在这种情况下,该方法就被称为重载(overloaded ),这个过程称为方法重载(method overloading )。方法重载是Java 实现多态性的一种方式。如果你以前从来没有使用过一种允许方法重载的语言,这个概念最初可能有点...

    Think in C++ 英文版(含卷一、卷二)

    《C++ 编程思想》英文原版,包括卷一与卷二。 卷一目录: Title Pages Preface 1: Introduction to Objects 2: Making & Using Objects 3: The C in C++ 4: Data Abstraction 5: Hiding the Implementation 6: ...

    Method-Overloading-and-OverRiding.rar_OA系统_Java_

    Method Overloading and OverRiding

Global site tag (gtag.js) - Google Analytics