Java面向对象之多态与重写

1 阅读2分钟

引入

多态

  • 我们之前举得例子中,遍历输出Arraylist<People> peoples中的内容,内容中既持有Student类的对象,又有持有Teacher类的对象,而且我们输出的对象并不是一串对象所在的地址,而是对象的内容,这是因为我们在People的子类Student和Teacher中都创建了toString方法,在输出时持有子类对象的父类引用调用了子类的toString方法,那么对于People类的Arraylist<People> peoples容器中的Student对象和Teacher对象来说,遍历出的内容会自动匹配相对应的其类中toString方法进行输出,当子类中没有该方法的重写才会去调用基类中的toString方法,也就是输出对象所在的地址,这种特性就叫做多态。

重写

  • 而在每个子类中都有一个和基类Object中的toString方法重名的方法,并且在方法体上方都标注了@Override,这时就是在子类中对父类方法进行了重写

  • 多态是java的一种特性,持有子类对象的父类引用访问子类中的方法,在不同的子类中如果有同名的方法会自动匹配,也就是持有子类的父类对象调用和父类的同名的子类方法,此时会根据调用对象的特征(持有的是哪个类型的子类)呈现多种状态。

// 定义抽象类
abstract class Animal {
    public abstract void makeSound();
}

// 定义具体子类
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

// 使用抽象类引用
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  // 使用抽象类引用指向具体子类对象
        Animal myCat = new Cat();

        myDog.makeSound();  // 输出 "Woof!"
        myCat.makeSound();  // 输出 "Meow!"
    }
}

形成条件

  • 实现多态,必须要存在继承的关系
  • 父类变量必须持有了子类的对象
方法的重写
  • 对于抽象类子类中必须重写父类的方法(即为必须都要有这个方法),没有只需return null即可,但子类必须有,重写即为子类中方法的名字,参数列表必须时相同的,这样才可以达成覆盖父类的方法。这一过程就是方法的重写(toSting方法似乎可以在父类中没有方法体也能实现多态)

注释@Override的重要性

  • 注意被重写的方法最好加上注释@Override,这样ide可以帮我们检查父类中有没有该方法,没有会提醒我们要加上。