在Java中重载和重写的常见问题

时间:2020-02-23 14:35:27  来源:igfitidea点击:

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