方法重写
方法重写也称方法覆盖,下面时方法重写的要求:
- 方法名,返回值,参数列表(类型、个数、顺序)都必须相同;
- 子类的访问权限比父类的中被重写的权限更高;(private < 默认权限 < protected <public);
- 父类被static、private、final修饰的方法、构造方法都不能被重写;
- @Override在编译器中可以帮助我们进行方法重写的检验;
方法重写和方法重载的区别:
方法重写更为严格要求方法名,返回值,参数列表都一致,而且访问权限子类比父类的中被重写的权限更高;方法重载就要求参数列表必须不同(三者有一不同就可以),返回类型没有必须要求,访问权限也没有必须要求。
绑定
绑定是指一个方法的调用与方法所在类关联起来。
静态绑定
静态绑定:在程序执行前方法已经绑定,此时由编译器或其他连接程序实现。Java中的方法只有被final、static、private修饰的方法以及构造方法是静态方法。
动态绑定
在运行时根据对象的类型进行绑定,编译器在方法调用前并不知道对象的类型。 要实现动态绑定,必须满足以下条件:
- 必须在继承体系下,即存在父类和子类。
- 子类必须对父类中的方法进行重写。
- 通过父类的引用调用被重写的方法。
向上转型
向上转型:实际就是创建一个子类对象,将其当成父类对象来使用,表现形式是这样的:父类类型 对象名 = new 子类类型()(例:Parent p = new Children())。它就是将小范围转成大范围。
向上转型只能调用父类和子类都有的方法而且会执行子类的(不执行父类的),子类特有成员就不能调用(调用了编译报错),但是如果访问父类和子类都有的成员变量时执行的是父类的成员变量。
如果向上转型后访问的是成员变量那么编译和运行时都是看左边(即父类);成员方法就是编译看左边,运行看右边。
向上转型有三种方法:直接赋值,方法传参,方法返回。
向上转型的优点:让代码实现更简单灵活。
向下转型
将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换,需要强制转换。表现形式是这样的:子类类型 对象名 = new 父类类型()(例:Children p = new Parent()),它就是将大范围转成小范围。
向下转型不安全,用的不多,如果要用的话,需要提高安全性,可以引用instanceof,表达式为true表示可以使用。
多态
多态就是同一个行为具有不同的表现形式或形态的能力。在了解多态前需要知道向上转型、方法重写以及动态绑定,实现多态的条件:
- 必须在继承体系下;
- 子类必须要对父类中的方法进行重写;
- 通过父类的引用调用重写的方法;
父类引用,指向不同的子类对象所发生的表现形式。向上面的方法中的参数是父类,如果是子类实例对象调用这个方法就会发生向上转型,然后在这个方法中又存在父类和子类都有的方法(eat())即方法重写,调用了多次方法所发生的表现形式不相同,就实现了多态。
以下是多态要注意的点:
- 多态下,子类和父类的成员变量相同时,访问的是父类的;
- 多态下,子类和父类的非静态方法相同时,访问的子类的;
- 多态下,子类和父类的静态成员相同时,访问的是父类成员;
- 多态下,不能访问子类特有的方法;
- 不要在构造方法中调用重写方法。