用方法重写实现多态

一、方法重写(override)

1. 什么是方法重写:

在子类中将父类的方法再重新定义一遍

如果子类从父类继承的方法不能满足子类的需要,或者不适合子类的需要。

此时子类可以将从父类继承的方法重写定义成满足自己需要的方法。

重新定义称为重写。

2. 方法重写的注意事项

  • 方法重写时,方法的返回值类型 方法名 参数列表都要与父类一样。(同名,同参,同返回)
  • 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
class Fu(){ 
    void show(){}
    public void method(){}
}
class Zi() extends Fu{
    public void show(){}  //扩大show的访问权限,编译运行没问题
    void method(){}       //缩小method的访问权限,编译错误
}
  • 方法的返回值类型 方法名 参数列表都要一样。

二、里氏替换原则

父类引用指向子类实例

里氏替换是指用子类实例替换父类实例,这种替换叫做里氏替换

Pet pet = new Pet();
Pet pet = new Dog();

2.1 父类引用指向子类对象的结论:

  • 父类引用可以代表任何其子类对象,代码表现为 Pet pet = new Dog() 或者 Pet pet = new Cat()

  • 父类引用指向哪个子类对象,调用的方法就是哪个子类中的方法。例如:

    Pet pet = new Dog();
    pet.sound(); //调用Dog的sound方法
    pet = new Cat();
    pet.sound(); //调用Cat的sound方法
    
  • 父类引用指向子类对象其实是增强了父类的功能。

2.2 里氏替换中的调用规则

  • 父类引用只能调用子类从父类继承的方法。
  • 当子类重写父类方法后,父类引用调用的是子类重写的方法,否则调用子类从父类继承的方法。

三、多态

3.1 什么是多态

多态就是多种形态,多种形式。

多态的实现方法有两种

  • 方法重写(公认的多态)
  • 方法重载(非公认的多态)

3.2 多态的语法格式

多态的定义格式:就是父类的引用变量指向子类对象(里氏替换原则)

父类类型  变量名 = new 子类类型();
变量名.方法名();
Pet pet = new Cat();
pet.toString();

3.3 多态的实现(方法重写)

3.3.1 普通类实现多态

  • 普通类多态定义的格式
父类 变量名 = new 子类();

例如:

class Fu {}
class Zi extends Fu {}
Fu f = new Zi();//类的多态使用

3.3.2 抽象类实现多态

  • 抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();

例如:

abstract class Fu {
     public abstract void method();
}
class Zi extends Fu {
    public void method(){
        System.out.println(“重写父类抽象方法”);
    }
}
Fu fu= new Zi();//类的多态使用

3.3.3 接口实现多态

  • 接口多态定义的格式
接口 变量名 = new 接口实现类();

例如:

interface Fu {
    public abstract void method();
}
class Zi implements Fu {
    public void method(){
         System.out.println(“重写接口抽象方法”);
    }
}
Fu fu = new Zi();//接口的多态使用
  • 注意事项

同一个父类的方法会被不同的子类重写。父类引用在调用方法时,调用的为各个子类重写后的方法。

Person p1 = new Student();
Person p2 = new Teacher();
p1.work(); //p1会调用Student类中重写的work方法
p2.work(); //p2会调用Teacher类中重写的work方法

当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容