重载和重写

Java中的重载和重写

  • 首先,Java程序中确定一个方法需要三个要素:调用者、方法名、参数列表。

方法重载(Overloand):

  • java允许一个类中定义多个同名方法,只要形参列表不同就可以了。如果同一个类中包含两个或者两个以上的方法名相同,但形参列表不同,则被称为方法的重载。

  • 方法重载要求就是两同一不同:同一个类中方法名相同,参数列表不同。至于方法的其它部分。如方法的返回值类型、修饰符等等,与方法重载没有任何关系。

方法重写(Override):

  • 子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外,子类需要重写父类方法。

  • 这种子类与父类同名方法的现象被称为方法重写,也被称为方法覆盖。可以说子类重写了父类的方法。也可以说子类覆盖了父类的方法。

  • 方法的重写要遵循“两同两小一大”,“两同”即方法名相同、参数列表相同:“两小”是值子类方法的返回值类型应比父类方法返回值类型更小或者相等(需要注意的是当返回值类型为基本数据类型的时候,返回值的类型必须形同),子类方法声明抛出的异常类型应该比父类声明抛出的异常类型更小或者相等;“一大”指的是子类方法的访问权限应该比父类方法的访问权限更大或者相等。

  • 当子类覆盖父类方法后,子类的对象将无法访问父类被覆盖的方法,但可以在子类中调用被覆盖的方法。如果需要在子类方法中调用父类被覆盖的方法,则可以使用super.被覆盖的实例方法或者类名.被覆盖的类方法。

<think>首先,用户的问题是:“方法重载重写区别”,这是关于Java编程中方法重载Overloading)方法重写(Overriding)的区别。 我需要用中文回答问题,因为用户指定了“请使用中文回答问题”。 我的回答结构: 1. 解释方法重载Overloading)。 2. 解释方法重写(Overriding)。 3. 比较两者的区别。 4. 最后,必须根据问题回答提出3-5个相关问题。 5. 相关问题必须以“§§相关问题§§”开头,并且输出在末尾。 6. 不能换行分散,所以相关问题应该在一行内列出,但示例中是数字列表,所以我可以用数字格式如“1. ··· 2. ···”等。 确保回答完整。 关键点: - **方法重载Overloading)**:在同一个类中,方法名相同,但参数列表不同(参数类型、个数或顺序不同)。返回类型可以不同,但不能仅靠返回类型区分重载重载发生在编译时。 - **方法重写(Overriding)**:在子类中重新定义父类的方法。方法名、参数列表返回类型必须相同。重写用于实现多态,发生在运行时。 区别总结: - 作用域:重载在同一个类;重写在子类。 - 参数:重载参数不同;重写参数相同。 - 返回类型:重载可以不同;重写必须相同(或协变返回)。 - 访问修饰符:重载无限制;重写不能更严格(如父类public,子类不能private)。 - 异常:重载无限制;重写不能抛出新的或更广的检查异常。 - 绑定:重载是编译时;重写是运行时。 现在,构建回答: - 先简要介绍两者。 - 然后详细解释区别。 - 最后输出相关问题。 相关问题:基于问题回答,提出3-5个相关问题。例如: 1. 方法重载能改变返回类型吗? 2. 方法重写时访问修饰符有什么限制? 3. 什么是协变返回类型在重写中的应用? 4. 重载重写如何影响多态性? 5. 在Java中,能重写静态方法吗? 确保相关问题数量在3-5个。 最后,输出格式: - 回答完问题后,直接输出“§§相关问题§§”,然后列出相关问题,用数字点格式。 完整回答结构: 1. 解释重载。 2. 解释重写。 3. 比较区别。 4. §§相关问题§§ 1. ... 2. ... 3. ...</think>在Java编程中,方法重载Overloading)方法重写(Overriding)是面向对象编程的核心概念,它们都涉及方法的复用,但存在本质区别。以下是详细解释: ### 方法重载Overloading) - **定义**:在同一个类中,定义多个同名方法,但参数列表不同(例如参数类型、个数或顺序不同)。返回类型可以相同或不同,但不能仅靠返回类型区分重载。 - **特点**: - 发生在编译时(静态绑定)。 - 用于提供方法的多版本实现,提高代码可读性。 - 访问修饰符无特殊限制。 - **示例**: ```java class Calculator { int add(int a, int b) { return a + b; } // 重载版本1 double add(double a, double b) { return a + b; } // 重载版本2,参数类型不同 } ``` ### 方法重写(Overriding) - **定义**:在子类中重新定义父类的方法。方法名、参数列表返回类型必须相同(或协变返回类型),用于覆盖父类行为。 - **特点**: - 发生在运行时(动态绑定),支持多态。 - 访问修饰符不能比父类更严格(如父类为public,子类不能为private)。 - 不能抛出新的检查异常(checked exception)或更广的异常。 - **示例**: ```java class Animal { void sound() { System.out.println("Animal sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Bark"); } // 重写父类方法 } ``` ### 主要区别 | 方面 | 方法重载 (Overloading) | 方法重写 (Overriding) | |--------------|------------------------------------------|------------------------------------------| | **作用域** | 同一个类中 | 子类继承父类 | | **参数列表** | 必须不同(类型、个数或顺序) | 必须相同 | | **返回类型** | 可以不同 | 必须相同(或协变返回,如子类返回更具体类型) | | **访问修饰符** | 无限制 | 不能比父类更严格(如不能从public改为private) | | **绑定时间** | 编译时(静态绑定) | 运行时(动态绑定) | | **异常处理** | 无限制 | 不能抛出新的或更广的检查异常 | | **目的** | 提供同名方法的不同实现 | 实现多态,覆盖父类行为 |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值