在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)方法抛出的异常不能更加限制,它将导致编译时间错误。

