什么是重载方法:
在同一个类中,java允许定义多个同名的方法,只要这些方法的参数的类型、或者个数不同即可。
比如:
public void MethodA(ClassBase classbase) {
}
public void MethodA(ClassA classbase) {
}
注:
返回值不能重载。返回值不同但是方法的参数列表相同则被视为是同一个方法。
比如:
public void MethodA(ClassBase classbase) {
}
public int MethodA(ClassBase classbase) {
return 0;
}
java方法的种类:
java中的方法分为类方法(static),对象方法(非static),类方法和对象方法都允许被重载。
如果重载方法的参数是类对象,就会出现一个比较棘手的问题。
首先我们定义以下的类。
ClassA 和ClassX 直接继承自ClassBase
ClassB继承自ClassA,ClassC继承自ClassB
class ClassBase{
@Override
public String toString() {
return "this is base ";
}
}
class ClassX extends ClassBase{
@Override
public String toString() {
return "this is class X ";
}
}
class ClassA extends ClassBase{
@Override
public String toString() {
return "this is class A ";
}
}
class ClassB extends ClassA{
@Override
public String toString() {
return "this is class B ";
}
}
class Classc extends ClassB{
@Override
public String toString() {
return "this is class c ";
}
}
重载方法要如何识别以下的代码。
public class OverLoadMethod {
public void MethodA(Object o) {
System.out.print("Now this is Object");
}
public void MethodA(ClassBase classbase) {
System.out.print("Now this is ClassBase");
}
public void MethodA(ClassA classbase) {
System.out.print("Now this is ClassA");
}
public void MethodA(ClassB classbase) {
System.out.print("Now this is ClassB");
}
public static void main(String[] args) {
OverLoadMethod overloadMethod=new OverLoadMethod();
overloadMethod.MethodA(new ClassB());
}
}
不出所料输出结果是:
Now this is ClassB
但是如果我们把代码
public void MethodA(ClassB classbase) {
System.out.print("Now this is ClassB");
}
注释掉
结果就变成了
Now this is ClassA
看来是在删除了参数为ClassB对象的方法后,编译器自动将方法识别为方法:
public void MethodA(ClassA classbase) {
System.out.print("Now this is ClassA");
}
也就是说,编译器会找到最接近方法传入参数的方法进行调用。
曾经我看到过一个面试题。
是重载了两个方法:
一个是
public void MethodA(Object o) {
System.out.print("Now this is Object");
}
还有一个是
public void MethodA(Sting o) {
System.out.print("Now this is String");
}
在调用了方法MethodA(null)之后的输出结果是什么。
答案是Now this is String
但是为什么
因为Sting是Object的子类于是调用最”下面”的方法。
还有一个问题,什么情况是编译器不能识别的?
比如以下的代码。
public class OverLoadMethod {
public void MethodA(ClassBase classbase) {
System.out.print("Now this is ClassBase");
}
public void MethodA(ClassA classbase) {
System.out.print("Now this is ClassA");
}
public void MethodA(ClassX classbase) {
System.out.print("Now this is ClassX");
}
public static void main(String[] args) {
OverLoadMethod overloadMethod=new OverLoadMethod();
overloadMethod.MethodA(null);
}
}
前面说到,ClassA和ClassX都直接继承自ClassBase于是此时编译器不知道null更靠近谁,于是报错。