【JavaSE专栏59】方法重写的概念及优先级问题,面向对象的多态性机制

简介: 【JavaSE专栏59】方法重写的概念及优先级问题,面向对象的多态性机制

一、什么是方法重写

方法重写是 Java 中一种实现多态性的机制。当子类继承自父类时,子类可以重写父类中已经存在的方法,以实现自己的特定逻辑或行为。方法重写要求子类中的方法与父类中被重写的方法具有相同的方法名称、参数列表和返回类型。

方法重写的特点有如下 4 44 点,请同学们认真学习。

  1. 子类中的重写方法必须与父类中的被重写方法具有相同的方法签名。
  2. 重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。例如,如果父类的方法是 public,那么子类重写的方法也必须是 public
  3. 重写方法不能声明比被重写方法更宽泛的异常,但可以声明更窄的异常,或者不抛出异常。
  4. 重写方法不能使用比被重写方法更窄的访问修饰符,例如,如果父类的方法是 protected,那么子类重写的方法可以是 protectedpublic,但不能是 private

方法重写的目的是在继承关系中,子类可以根据自己的需要对父类的方法进行个性化定制,以实现更灵活和特定的功能,重写方法会在运行时动态决定调用哪个方法,实现了多态性的特性。


二、为什么需要用到方法重写

Java 中需要使用方法重写的主要原因是实现多态性和代码灵活性

  1. 多态性:方法重写是实现多态性的重要手段之一。当子类继承父类并重写了父类的方法时,可以通过父类引用指向子类对象,并根据实际的对象类型调用相应的重写方法。这样可以使得程序在运行时根据对象的不同而表现出不同的行为。
  2. 灵活性:方法重写使得子类可以根据自身的需要对父类的方法进行定制化的修改。子类可以根据具体的业务需求重写父类的方法来实现特定的功能。这样可以提高代码的灵活性和可扩展性,使得程序更易于维护和扩展。

另外,方法重写还可以提高代码的可读性和可理解性,通过在子类中重写父类的方法,可以使得代码更加符合语义和逻辑,使得程序更易于理解。

总之,方法重写是实现多态性、提高代码灵活性和可读性的重要手段,使得 Java 程序更加灵活、可扩展和易于理解。


三、方法重写优先级问题

在 Java 中,方法重写的优先级是基于继承关系的

如果子类重写了父类的方法,那么在调用方法时会优先调用子类中的重写方法。

下面是一个简单的样例代码来说明方法重写的优先级,请同学们认真学习。

class Animal {
    public void makeSound() {
        System.out.println("Animal makes sound");
    }
}
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.makeSound();  // Output: "Animal makes sound"
        Dog dog = new Dog();
        dog.makeSound();  // Output: "Dog barks"
        Animal animal2 = new Dog();
        animal2.makeSound();  // Output: "Dog barks"
    }
}

在上面的例子中,Animal 类有一个 makeSound() 方法,而 Dog 类继承自 Animal 类并重写了 makeSound() 方法。在 main() 方法中,我们分别创建了 Animal 类和 Dog 类的对象,并调用它们的 makeSound() 方法。

animal 对象调用 makeSound() 方法时,它会调用 Animal 类中的 makeSound() 方法,输出 Animal makes sound

dog 对象调用 makeSound() 方法时,它会调用 Dog 类中重写的 makeSound() 方法,输出 Dog barks

animal2 对象(Animal 类型的引用变量,指向 Dog 类型的对象)调用 makeSound() 方法时,由于多态性的特性,它同样会调用 Dog 类中重写的 makeSound() 方法,输出 Dog barks

这说明在方法重写中,方法的调用是基于对象的实际类型,而不是变量的类型,所以子类重写的方法会优先调用。


四、方法重写面试题

  1. 什么是方法重写?请举例说明。
  2. 方法重写和方法重载有什么区别?
  3. 方法重写的规则是什么?
  4. 如果父类的方法是 private 的,能够被子类重写吗?
  5. 如果子类重写了父类的方法,能够抛出比父类方法声明更宽泛的异常吗?
  6. 父类的静态方法能够被子类重写吗?
  7. 如果父类的方法是 final 的,能够被子类重写吗?
  8. 调用重写方法的时候,到底调用父类的方法还是子类的方法?
  9. 能否在父类中调用子类的重写方法?
  10. 方法重写和多态之间的关系是什么?

五、总结

本文讲解了 Java 中方法重写的概念及优先级问题,并给出了样例代码,在下一篇博客中,将讲解 Java 中静态代码块的知识点。


相关文章
【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念
【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念
|
5月前
|
Java
JavaSE 面向对象程序设计进阶 继承和方法重写 2024理论与内存详解
JavaSE 面向对象程序设计进阶 继承和方法重写 2024理论与内存详解
32 3
|
4月前
|
Java
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
6月前
|
编译器 C语言 C++
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
|
6月前
|
Java 数据安全/隐私保护 开发者
从零到一:深入理解Java中的封装、继承与多态
从零到一:深入理解Java中的封装、继承与多态
458 0
|
6月前
|
Java
Java面向对象编程,解释封装、继承和多态的概念。
Java面向对象编程,解释封装、继承和多态的概念。
77 2
|
6月前
|
Java 编译器
【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]
【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]
39 0
|
6月前
|
Java
【Java 多态】面向对象编程の重要概念,多态是什么,附带小案例
【Java 多态】面向对象编程の重要概念,多态是什么,附带小案例
|
Java
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。(一)
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。
88 0
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。(一)
|
Java
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。(二)
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。
83 0
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。(二)