提示:以下是本篇文章正文内容
一、Java中的多态
多态,就是方法或对象有多种形态,包括方法的多态和对象的多态。
1. 方法的多态:
重写override和重载overload就体现多态,重写和重载不多赘述。

讯享网
2. 对象的多态 (关键)
编译类型 对象名 = new 运行类型();
编译类型:简单理解 javac 编译时看的类型,要编译过的去不能报语法错误;
运行类型:过了编译阶段,到了运行阶段 java 要看的类型。
编译类型看 = 的左边,运行类型看 = 的右边:
如:Animal animal = new Dog();
对象animal的编译类型是Animal,运行类型是Dog

二、对象的多态 (关键)
1.多态的向上转型
(可以调用父类中所有的成员,但执行的方法是子类中重写的方法)
语法:
父类类型 父类引用名 = new 子类类型();
// 向上转型:父类的引用名 指向 子类的对象 Animal animal = new Cat(); Object object = new Cat(); // 父类可以不是直接父类
讯享网
注意两点:
编译类型 对象名 = new 运行类型();
1)编译阶段:能调用哪些成员,是由编译类型决定的,所以父类引用名,不能调用子类特有的成员,否则编译不通过直接报错;
2)运行阶段:如果调用的是方法,则由运行类型决定,调用方法要从子类开始查找,一般调用的就是子类重写的方法;如果调用的是属性,就直接看编译类型,也调用的是父类属性!!!(要记住,属性无重写)
讯享网Animal animal = new Cat(); animal.catchMouse(); // 编译报错!catchMouse是子类Cat特有的方法 animal.eat(); // 调用子类Cat重写的方法,猫吃鱼...
class Base{
// 父类 int count = 10; public void display(){
System.out.println(this.count);} } class Sub extends Base{
// 子类 int count = 20; public void display(){
System.out.println(this.count);} } // main中调用 public static void main(String[] args){
Sub sub = new Sub(); Base base = sub; // 向上转型 System.out.println(base.count); // 输出10,调用父类中的count base.display(); // 输出20,调用子类中的display() }
2.多态的向下转型
(可以调用子类中所有的成员)
语法:
子类类型 子类引用名 = (子类类型)父类引用;
向下转型,要和向上转型结合起来思考,后面的父类引用是向上转型产生的。
注意两点:
1)只能强转父类的引用,不能强转父类的对象;
2)强转的父类引用,先前已经指向要强转类型 (子类) 的对象;
也就是向下转型是和向上转型结合起来的,
向上转型:Animal animal = new Cat();
向下转型:Cat cat = (Cat) animal;
向下转型:Dog dog = (Dog) animal; // 错误!!animal此时指向Cat对象
讯享网Animal animal = new Cat(); Cat cat = (Cat) animal; cat.CatchMouse(); // 调用Cat类中特有的猫抓老鼠方法
总结
为何需要向上转型和向下转型 ?
1. 向上转型:父类引用可以调用子类中重写父类的方法,这样当需要添加新功能时,新增一个子类即可,而不需要更改父类代码;
Animal animal = new Dog(); animal.eat(); // 会调用Dog类中的eat方法; animal = new Cat(); animal.eat(); // 又会调用Cat类中的eat方法;
2. 向下转型:一般是为了重新获得因为向上转型而失去的子类特性,所以向下转型前一般都有向上转型,也会结合instanceOf使用;
讯享网Animal animal = new Dog(); Dog dog = (Dog) animal; // 为了使用Dog类中独有的属性和方法 animal = new Cat(); Cat cat = (Cat) animal; // 为了使用Cat类中独有的属性和方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/16579.html