java方法的重载与覆盖的返回值类型

首先看一段程序:

package testOverLoadandoverRide;


public class A extends B{
//下面的是方法的覆盖(overRiding)
public void riding(){
System.out.println("this is  overRiding ");
}
//下面两个函数是方法的重载(overLoading),但是返回值类型不同,可以运行
public String loading(int x){
System.out.println("this is overLoading return String");
return null;
}
public int loading(int x,int y){
System.out.println("this is overLoading return int");
return 0;
}
public static void main(String[] args) {
A a = new A();
a.riding();
a.loading(2);
a.loading(2,3);
}
}


class B{
public void riding(){
System.out.println("this is B");
}
}

下面是运行结果:

this is  overRiding 
this is overLoading return String
this is overLoading return int

有以上程序可以知道,方法的重载是可以改变返回值类型的,但是尚不能说明方法的覆盖是否可以改变返回值类型,现在修改A类中 riding()方法的返回值类型为int,

public int riding(){
System.out.println("this is  overRiding ");
}

此时会有如下的错误:


由此可知,方法的覆盖是不允许修改返回值类型的。

以上测试程序运行在JDK1.5版本。

我对此的解释为:

方法的重载是根据函数的参数列表来决定的,即:参数列表的个数,类型,顺序三个方面;

对于其返回值类型,就是改变了也不会有影响,因为你不可能写成参数类表相同(个数,类型,顺序)的方法重载,因为那根不就不是重载。所以返回值类型也就不能作为程序运行时选择函数的一个标准,因此返回值类型也就没了对函数选择时的影响。

方法的覆盖不仅根据函数的参数列表还要根据返回值类型,因为覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

覆盖时还有“类型的提升”这一点,具体可以参考

http://topic.csdn.net/u/20110318/16/0acfac41-4ce4-4a1e-b3e3-9b4af265c691.html

总结如下:

方法覆盖必须满足下列条件

(1) 子类的方法的名称及参数必须和所覆盖的方法相同

(2) 子类的方法返回类型必须和所覆盖的方法相同

重载方法必须满足下列条件

(1) 方法名必须相同

(2) 方法的参数签名必须相同

(3) 方法的返回类型和方法的修饰符可以不相同


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的方法重载(Overload)和方法覆盖(Override)都是实现多态性的重要手段,但它们的实现方式和应用场景有所不同。 方法重载指在同一个类中定义多个方法,它们的方法名相同但参数列表不同,即参数类型、参数个数、参数顺序至少有一个不同。在调用该方法时,编译器会根据实参的类型、个数和顺序选择最匹配的方法进行调用。方法重载通常用于解决同一问题的不同情况,提高代码的复用性和可读性。 例如,下面是一个计算两个数之和的方法add()和一个计算三个数之和的方法add()的例子: ``` public class MathUtils { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } } ``` 方法覆盖指子类重新定义了父类中已经实现的方法,即方法名、参数列表和返回值类型都相同。子类的方法必须和父类的方法有相同的方法签名(方法名和参数列表),并且访问权限不能更低,否则会编译错误。在调用该方法时,会根据对象的实际类型选择调用哪个方法方法覆盖通常用于实现多态性,即子类对象可以替换父类对象,实现不同的行为。 例如,下面是一个父类Animal和一个子类Cat的例子: ``` class Animal { public void move() { System.out.println("动物在移动"); } } class Cat extends Animal { public void move() { System.out.println("猫在走猫步"); } } ``` 在这个例子中,子类Cat重写了父类Animal中的move()方法,实现了不同的行为。如果创建一个Cat对象并调用move()方法,会输出“猫在走猫步”。而如果创建一个Animal对象并调用move()方法,会输出“动物在移动”。这就是多态性的体现。 需要注意的是,方法重载方法覆盖的区别在于方法签名是否相同。方法签名包括方法名、参数列表和返回值类型。如果只是返回值类型不同,是不能构成方法重载方法覆盖的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值