在Java中重载和重写的常见问题
1.方法重载是什么?
答:如果两个或者多个方法具有相同的名称,但是不同的参数然后调用方法重载。
例如:数组的排序方法有许多重载版本。
我们可以对Double,Int,String等进行排序。
2.方法重载的方法是什么?
方法重载规则:
|参数数量|重载(overloading)方法可以具有不同数量的参数|
| --- - | --- |
|日期类型|重载(overloading)方法可以具有参数的不同数据类型|
|返回类型|还可以更改返回类型,但也应更改任务数参数或者数据类型。 |
|参数的顺序|如果我们更改了参数序列,那么它也是一个有效的方法重载,所以提供了不同的数据类型参数。 |
|构造函数|可以重载(overloading)|
3.我们可以在Java中重载(overloading)静态方法吗?
回答:
是的,我们可以在Java中重载(overloading)静态方法,但我们无法重写(overwriting)它们。
你可以重载(overloading)主要方法吗?
答:是的,我们可以重载(overloading)主要方法,但只有JVM调用类时,将仅使用带有签名公共静态void main的方法(String [] args)。
5.在方法重载时,我们只能在返回类型中更改返回类型吗?
答案:我们无法。
如果我们只更改返回类型,编译器将变得模糊,弄清楚哪种方法调用。
这就是为什么无法更改返回类型。
6.什么是重写(overwriting)的方法?
答:如果子类具有与基类相同的方法,那么它被称为重写(overwriting)或者用另一个单词的方法,如果子类别向其一个父母类中存在的任何方法提供特定的方法,那么它被称为方法重写(overwriting)。
7.方法重写(overwriting)的方法是什么?
方法规则重写(overwriting):
|参数|绝不能改变|
| --- - | --- |
|返回类型|除了协变量(亚型)返回之外无法改变|
|访问修改器|不得更具限制性。可以减少限制性。 |
|例外|可以减少或者消除但不能抛出新的/更广泛的检查异常|
|构造函数|不能被重写(overwriting)|
|静态方法|不能被重写(overwriting)|
|最终方法|不能被重写(overwriting)|
8.我们可以重写(overwriting)Java中的静态方法吗?
答:否,我们不能重写(overwriting)Java中的静态方法。
静态方法属于非对象级别的类级别。
我们可以在子类中创建具有相同名称的静态方法,它不会给我们编译错误,但它被称为隐藏方法。
你不会通过它来重写(overwriting)行为。
9.我们可以重写(overwriting)Java中的私有方法吗?
答:否,我们无法重写(overwriting)Java中的私有方法。
私有方法对儿童课不可见,因此我们无法重写(overwriting)它,我们只能隐藏它。
10.你能重写(overwriting)最终方法吗?
答:因为最终方法是不重写(overwriting)的。
我们声明了一个方法最终,因为我们不希望它在子类中被重写(overwriting)。
11.什么是静态绑定?
答:编译Java程序时。
在编译过程中,编译器绑定方法调用实际方法。
这称为静态绑定,并且在编译时发生重载绑定的方法。
12.什么是动态约束力?
答:绑定在运行时发生重写方法被称为动态绑定。
13. Java中有什么协变返回类型?
协变返回类型意味着如果子类重写(overwriting)任何方法,则此重写(overwriting)方法的返回类型可以是基类方法的返回类型的子类。
例如:
package org.igi.theitroad; public class BaseClass { public A m1() { System.out.println("In BaseClass method"); return new A(); } public static void main(String args[]) { BaseClass b=new SubClass(); b.m1(); } } class SubClass extends BaseClass { public B m1() { System.out.println("In SubClass method"); return new B(); } } class A { } class B extends A { }
上面的例子是协变返回类型的完美示例。
14.预测以下计划的输出:
public class MethodOverloadingExample { public void methodTest(Object object) { System.out.println("Calling object method"); } public void methodTest(String object) { System.out.println("Calling String method"); } public static void main(String args[]) { MethodOverloadingExample moe=new MethodOverloadingExample(); moe.methodTest(null); } }
输出:
Calling String method
说明:当我们有两个相同方法的重载(overloading)版本时,JVM将始终调用最具体的方法。
15.预测以下计划的输出:
import java.io.IOException; public class MethodOverrdingTestMain { public static void main(String[] args) { B b=new B(); try { b.method(); } catch (Exception e) { e.printStackTrace(); } } } class A{ public void method() throws IOException { } } class B extends A{ public void method() throws Exception { } }
输出:
compile time error
解释:
由于重写(overwriting)方法抛出的异常不能更加限制,它将导致编译时间错误。