java 无法仅仅依靠返回值的不同对方法进行重载的原因

对于java 程序员来说,都知道或听过java 无法仅仅依靠返回值的不同对方法进行重载,但具体原因是什么呢,在《深入理解Java虚拟机 JVM高级特性与最佳实践》class类文件的结构-方法表集合这一章节给出了具体的原因(原文可参考6.3.6小节)。

重载一个方法时,必须确保有一个与原方法不同的特征签名,特征签名就是方法中各个参数在常量池中的字段符号引用的集合
从这句话中可以看到特征签名里面不包含返回值类型,所以java无法仅仅依靠返回值类型的不同(即方法参数相同,只是返回值类型不同)对已有方法进行重载。

这里需要注意一点:
“在Class文件格式中,特征签名的范围更大一些,只要描述符不是完全一致的两个方法也可以共存。也就是说,如果两个方法有相同的名称和特征签名,只有返回值不同,那么也是可以合法共存于同一个Class文件中的”。



参考:
《深入理解Java虚拟机 JVM高级特性与最佳实践》

### 回答1: 方法重载(Method Overloading)和方法重写(Method Overriding)都是Java中实现多态性的方式,但它们不同的点在于: 1. 方法重载是在同一个类中定义了多个方法,它们具有相同的方法名,但参数列表不同(参数类型、参数个数或参数顺序不同),例如: ``` public int add(int a, int b) { return a + b; } public float add(float a, float b) { return a + b; } ``` 2. 方法重写是子类对父类中同名、同参数列表的方法重新定义,使得子类可以根据需要重写父类的方法实现,例如: ``` public class Animal { public void move() { System.out.println("动物在移动"); } } public class Dog extends Animal { public void move() { System.out.println("狗在奔跑"); } } ``` 在上面的例子中,Dog类重写了Animal类中的move()方法,使得狗在移动时输出“狗在奔跑”的信息。 3. 方法重载的参数列表必须不同,而方法重写的参数列表必须相同。 4. 方法重载可以发生在同一个类中,也可以发生在父子类之间,而方法重写只能发生在父子类之间。 总的来说,方法重载是为了方便调用,可以根据参数的不同实现不同的逻辑,而方法重写是为了实现多态性,子类可以根据需要重写父类的方法实现自己的逻辑。 ### 回答2: 方法重载(Method Overloading)指的是在同一个类中,可以存在多个方法具有相同的名称,但是参数列表不同的情况。它主要根据方法的参数类型、参数个数和参数顺序来区分各个方法。调用方法时,会根据提供的参数选择合适的方法方法重载主要用于增加代码的灵活性和可读性。 方法重写(Method Overriding)指的是在子类中重写父类中已经存在的方法,使得子类可以根据自己的需求来实现特定的方法功能。重写的方法和父类方法具有相同的名称、参数列表和返回值类型。在编译时,会根据对象的类型来调用对应的方法方法重写主要用于实现多态性,即通过父类类型的变量可以调用不同子类对象的方法方法重载方法重写的区别主要有以下几点: 1. 定义所在:方法重载发生在同一个类中,而方法重写发生在父类和子类之间。 2. 参数列表:方法重载根据参数的类型、个数和顺序进行区分,而方法重写必须保持参数列表的一致性。 3. 返回值类型:方法重载不依赖于返回值类型,而方法重写必须保持返回值类型的一致性。 4. 调用方式:方法重载是在编译时根据参数来决定调用哪个方法,而方法重写是在运行时根据对象的实际类型来决定调用哪个方法。 5. 相关类:方法重载在同一个类内进行,而方法重写是在父子类之间进行。 6. 功能目的:方法重载用于增加代码灵活性和可读性,方法重写用于实现多态性。 总结来说,方法重载是在同一类中根据参数来定义多个同名方法,而方法重写是在子类中对父类已有方法进行重新实现。 ### 回答3: 方法重载(Overloading methods)和方法重写(Overriding methods)是面向对象编程的两个重要概念,它们的区别如下: 方法重载指的是在同一个类中定义多个方法名相同但参数类型、个数或顺序不同方法重载方法可以有不同的返回类型,但不能仅仅依靠不同的返回类型进行重载。在方法重载中,方法之间的关系是在同一个类中进行的,它们具有相同的方法名,但具有不同的参数。方法重载提供了更加灵活的使用方式,可以根据不同的参数类型和个数进行方法的调用。 方法重写指的是子类覆盖父类中相同名称、参数列表和返回类型的方法。在方法重写中,子类可以重新实现父类中的方法,以满足自己的需求。重写的方法必须具有相同的返回类型,参数列表和方法名,但实现可以不同方法重写实现了多态性,即通过父类类型的引用可以调用子类中重写的方法方法重载方法重写的区别在于: 1. 定义位置不同方法重载是在同一个类中定义,方法重写是在子类中重新实现。 2. 参数类型和个数:方法重载的参数类型、个数或顺序不同,而方法重写的参数类型、个数和顺序必须相同。 3. 返回类型:方法重载可以有不同的返回类型,而方法重写必须具有相同的返回类型。 4. 关系和作用:方法重载在同一个类中进行,为了提高代码的复用性和灵活性;方法重写在继承关系中进行,实现了多态性。 综上所述,方法重载方法重写是面向对象编程中常用的技术,它们都有各自的用途和特点,并在不同的场合下有不同的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值