Java中方法重写的学习

方法重写


方法重写的规则

在Java中,方法重写(Overriding)是面向对象编程中的一个核心概念,它允许子类提供一个与父类相同名称、相同参数列表的方法,以实现或修改父类方法的行为。方法重写必须遵循一定的规则,以确保程序的正确性和可维护性。以下是Java中方法重写的规则:

方法签名必须相同

  • 重写的方法必须具有与父类方法相同的方法名、返回类型和参数列表。参数列表包括参数的类型、顺序和个数。

访问修饰符不能更严格

  • 重写的方法的访问修饰符不能比父类的方法更严格。例如,如果父类方法是public,则子类方法可以是publicprotected,但不能是private

抛出的异常不能更多或更宽泛

  • 重写的方法不能抛出比父类方法更多或更宽泛的异常。但是,子类方法可以抛出比父类方法更少或更具体的异常,或者不抛出异常。

方法重写必须在继承关系中

  • 重写的方法必须在父类和子类之间的继承关系中存在。也就是说,子类必须是父类的直接或间接子类。

静态方法不能被重写

  • 静态方法属于类而不是实例,因此不能被重写。子类可以定义一个与父类静态方法相同的静态方法,但并不是重写,而是隐藏父类的静态方法(这通常被称为方法隐藏)。

final方法不能被重写

  • 如果一个方法被声明为final,则它不能被任何子类重写。final方法是一种固定不变的方法,子类不能改变其行为。

构造方法不能被重写

  • 构造方法是用于创建对象的特殊方法,不能被重写。但是,子类可以通过调用super关键字来调用父类的构造方法。

返回类型

  • 重写方法的返回值类型必须与被重写方法的返回值类型相同,或者是其子类型。在Java 5及以后的版本中,如果父类方法返回类型是Object,则子类重写该方法时可以返回任何类型的对象。

synchronized和strictfp关键字对重写规则的影响

  • synchronized关键字用于在多线程环境中获取和释放监听对象,它对重写规则没有直接影响,即synchronized方法可以去重写一个非同步方法。
  • strictfp关键字用于确保浮点运算的精确性,它同样对重写规则没有直接影响。

示例

假设有一个父类Animal和一个子类Dog,子类Dog重写了父类Animal中的eat方法:

复制代码
public class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {
        super.eat(); // 调用父类的eat方法
        System.out.println("Dog is eating specially");
    }
}

在这个例子中,Dog类重写了Animal类的eat方法,并且使用@Override注解来标记这是一个重写的方法。这样,编译器能够检查该方法是否符合重写规则。

方法重载的规则

Java中的方法重载(Overloading)是指在同一个类中定义多个方法名相同但参数列表不同的方法。通过方法重载,可以根据不同的参数类型和个数来调用不同的方法,从而提高代码的灵活性和可复用性。以下是Java方法重载的规则:

方法名必须相同

  • 在同一个类中,只有方法名相同的方法才有可能构成重载关系。如果方法名不同,则无论参数列表如何,它们都不是重载关系。

Java中的方法重载(Overloading)是指在同一个类中定义多个方法名相同但参数列表不同的方法。通过方法重载,可以根据不同的参数类型和个数来调用不同的方法,从而提高代码的灵活性和可复用性。以下是Java方法重载的规则:

方法名必须相同

  • 在同一个类中,只有方法名相同的方法才有可能构成重载关系。如果方法名不同,则无论参数列表如何,它们都不是重载关系。

参数列表必须不同

  • 参数列表的不同可以体现在参数类型、参数个数或参数顺序上。只要这三个方面中的任何一个不同,就可以构成重载关系。
  • 需要注意的是,仅返回类型不同并不能构成重载关系。

访问修饰符和返回类型不影响重载

  • 方法的访问修饰符(如public、private、protected)和返回类型(但返回类型不能作为区分重载的依据)对重载没有影响。即使两个方法的访问修饰符或返回类型不同,只要它们的方法名和参数列表相同,它们也不是重载关系。

可以抛出不同的异常

  • 重载方法可以抛出不同的异常,但需要遵循Java异常处理的规则。异常类型并不作为重载的依据,但可以在重载的方法中根据实际需要抛出不同的异常。

调用重载方法时根据参数类型和个数确定

  • 在调用重载方法时,编译器会根据传入的参数类型和个数来匹配对应的方法,选择最匹配的方法进行调用。

参数列表必须不同

  • 参数列表的不同可以体现在参数类型、参数个数或参数顺序上。只要这三个方面中的任何一个不同,就可以构成重载关系。
  • 需要注意的是,仅返回类型不同并不能构成重载关系。

访问修饰符和返回类型不影响重载

  • 方法的访问修饰符(如public、private、protected)和返回类型(但返回类型不能作为区分重载的依据)对重载没有影响。即使两个方法的访问修饰符或返回类型不同,只要它们的方法名和参数列表相同,它们也不是重载关系。

可以抛出不同的异常

  • 重载方法可以抛出不同的异常,但需要遵循Java异常处理的规则。异常类型并不作为重载的依据,但可以在重载的方法中根据实际需要抛出不同的异常。

调用重载方法时根据参数类型和个数确定

  • 在调用重载方法时,编译器会根据传入的参数类型和个数来匹配对应的方法,选择最匹配的方法进行调用。
posted @   BingBing爱化学-04044  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示