java 如何重写父类方法

java 如何重写父类方法

在Java中,子类可以重写父类的方法。重写的步骤包括:1、创建一个与父类中同名的方法,参数列表也必须相同;2、方法的返回类型应该与父类的方法返回类型相同,或者是其子类型;3、子类方法的访问级别不能低于父类方法的访问级别;4、子类的方法抛出的异常应该被父类的方法声明的异常所覆盖或者是其子类;5、如果父类方法被声明为final,则不能被子类重写。 其中,我们来详细讨论第一点:创建一个与父类中同名的方法,参数列表也必须相同。

一、创建一个与父类中同名的方法,参数列表也必须相同

在Java中,如果子类需要改变父类的某个方法的行为,可以通过重写这个方法来实现。当子类对象调用这个方法时,将会执行子类中定义的版本,而不是父类中的版本。首先,你需要声明一个与父类方法同名的方法,且参数列表也必须相同。这是因为Java使用方法名和参数列表来唯一确定一个方法,这被称为方法的签名。只有当方法签名相同时,才能构成重写。

例如,假设我们有一个父类Animal,其中有一个方法move():

public class Animal {

public void move() {

System.out.println("Animals can move");

}

}

如果我们要在子类Dog中重写这个方法,我们需要在Dog类中声明一个同名的move()方法:

public class Dog extends Animal {

public void move() {

System.out.println("Dogs can walk and run");

}

}

在这个例子中,Dog类重写了Animal类的move()方法。当我们创建一个Dog对象并调用move()方法时,将会执行Dog类中的move()方法,而不是Animal类中的move()方法。

二、方法的返回类型应该与父类的方法返回类型相同,或者是其子类型

在Java 5.0及以后的版本中,当重写父类的方法时,子类方法的返回类型可以与父类方法的返回类型相同,也可以是其子类型。这被称为协变返回类型。例如,假设我们有一个父类Animal和一个子类Dog,还有一个方法getAnimal(),这个方法在Animal类中返回Animal对象,在Dog类中返回Dog对象。这是合法的,因为Dog是Animal的子类型。

public class Animal {

public Animal getAnimal() {

return new Animal();

}

}

public class Dog extends Animal {

public Dog getAnimal() {

return new Dog();

}

}

在这个例子中,Dog类重写了Animal类的getAnimal()方法,但返回类型从Animal变为了Dog。

三、子类方法的访问级别不能低于父类方法的访问级别

在Java中,有四种访问级别:public、protected、package-private(默认)和private。其中,public是最高的访问级别,任何类都可以访问。protected和package-private的访问级别较低,只有同一个包的类或者是子类可以访问。private是最低的访问级别,只有类内部可以访问。

当重写父类的方法时,子类方法的访问级别不能低于父类方法的访问级别。这是为了保证子类对象可以在任何允许访问父类方法的地方被正确地使用。

例如,假设我们有一个父类Animal,其中有一个public方法move():

public class Animal {

public void move() {

System.out.println("Animals can move");

}

}

如果我们在子类Dog中重写这个方法,但将访问级别改为protected,那么编译器将会报错:

public class Dog extends Animal {

protected void move() {

System.out.println("Dogs can walk and run");

}

}

这是因为子类Dog中的move()方法的访问级别低于父类Animal中的move()方法。

四、子类的方法抛出的异常应该被父类的方法声明的异常所覆盖或者是其子类

在Java中,当重写父类的方法时,子类的方法抛出的异常应该被父类的方法声明的异常所覆盖,或者是其子类。这是为了保证子类对象可以在任何允许调用父类方法的地方被正确地使用。

例如,假设我们有一个父类Animal,其中有一个方法move(),这个方法声明抛出IOException:

public class Animal {

public void move() throws IOException {

System.out.println("Animals can move");

}

}

如果我们在子类Dog中重写这个方法,我们可以声明抛出IOException,也可以声明抛出FileNotFoundException,因为FileNotFoundException是IOException的子类。但是,我们不能声明抛出Exception,因为Exception不是IOException的子类。

public class Dog extends Animal {

public void move() throws FileNotFoundException {

System.out.println("Dogs can walk and run");

}

}

在这个例子中,Dog类重写了Animal类的move()方法,但抛出的异常从IOException变为了FileNotFoundException。

五、如果父类方法被声明为final,则不能被子类重写

在Java中,如果父类的方法被声明为final,那么这个方法就不能被子类重写。这是因为final方法是最终的,不能被改变。如果尝试重写final方法,编译器将会报错。

例如,假设我们有一个父类Animal,其中有一个final方法move():

public class Animal {

public final void move() {

System.out.println("Animals can move");

}

}

如果我们在子类Dog中尝试重写这个方法,编译器将会报错:

public class Dog extends Animal {

public void move() {

System.out.println("Dogs can walk and run");

}

}

这是因为Animal类的move()方法被声明为final,不能被Dog类重写。

总结

Java中的方法重写是面向对象编程中的一个重要特性,它允许子类改变父类的行为。当重写父类的方法时,需要注意几个重要的规则:子类方法的名称和参数列表必须与父类方法相同;子类方法的返回类型应该与父类的方法返回类型相同,或者是其子类型;子类方法的访问级别不能低于父类方法的访问级别;子类的方法抛出的异常应该被父类的方法声明的异常所覆盖,或者是其子类;如果父类方法被声明为final,则不能被子类重写。

相关问答FAQs:

1. 如何在Java中重写父类的方法?
在Java中,要重写父类的方法,需要在子类中创建一个具有相同名称、参数列表和返回类型的方法。使用@Override注解可以确保你正确地重写了父类的方法。

2. 为什么要重写父类的方法?
重写父类的方法可以允许子类在继承的基础上对方法进行定制化的修改。这样可以使得子类根据自身的需求来实现不同的逻辑,达到更好的灵活性和可扩展性。

3. 如何调用重写后的父类方法?
在子类中调用重写后的父类方法,可以使用super关键字来引用父类的方法。通过super.methodName()的方式,可以在子类中调用父类中被重写的方法,同时也可以在子类中添加额外的逻辑。这样可以确保父类的方法仍然被执行,并且可以扩展父类方法的功能。

原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/200511

(0)
Edit1Edit1
上一篇 2024年8月13日 下午3:54
下一篇 2024年8月13日 下午3:54
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部