方法重写
目录
方法重写的规则
在Java中,方法重写(Overriding)是面向对象编程中的一个核心概念,它允许子类提供一个与父类相同名称、相同参数列表的方法,以实现或修改父类方法的行为。方法重写必须遵循一定的规则,以确保程序的正确性和可维护性。以下是Java中方法重写的规则:
方法签名必须相同
- 重写的方法必须具有与父类方法相同的方法名、返回类型和参数列表。参数列表包括参数的类型、顺序和个数。
访问修饰符不能更严格
- 重写的方法的访问修饰符不能比父类的方法更严格。例如,如果父类方法是
public
,则子类方法可以是public
或protected
,但不能是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异常处理的规则。异常类型并不作为重载的依据,但可以在重载的方法中根据实际需要抛出不同的异常。
调用重载方法时根据参数类型和个数确定
- 在调用重载方法时,编译器会根据传入的参数类型和个数来匹配对应的方法,选择最匹配的方法进行调用。