ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多态

2021-08-27 18:02:09  阅读:137  来源: 互联网

标签:对象 子类 多态 转型 print 父类 public


多态

多态的概述

  • 什么是多态

    ​ 同一个对象,在不同时刻表现出来的不同形态

  • 多态的前提

    • 要有继承或实现关系
    • 要有方法的重写
    • 要有父类引用指向子类对象

多态性在开发中可以体现在以下两个方面:

  • 方法的多态性:重载和重写;

  • 对象的多态性:父子类对象的转换。

    • 向上转型:子类对象变为父类对象。格式:父类 父类对象 = 子类实例,自动转换;
    • 向下转型:父类对象变为子类对象。格式:子类 子类对象 = (子类) 父类实例,强制转换;

多态中成员访问特点

成员访问特点

  • 成员变量:不存在变量重写,所以如果父类和子类有同名的变量,那么子类在堆中开辟空间时会开辟两个变量的空间。

    ​ 编译看父类,运行看父类

  • 成员方法

    ​ 编译看父类,运行看子类

//观察向上转型(自动完成)
public class A{
    public int age = 20;
    public void print(){
        System.out.println("A的print");
    }
}
public class B extends A{
    public int age = 40;
    public void print(){
        System.out.println("B的print");
    }
}

public class Demo{
    public static void main(String[] args){
        B b = new B();
        b.print();//结果为:B的print
        
        A a = new B(); //实例化的是子类的对象,对象向上转型
        a.print(); //成员方法看子类,结果是:B的print
        System.out.println(a.age);//成员变量看父类,结果是20.
    }
}

通过上例可以看出对象向上转型的特点,整个操作根本不用关心对象的声明类型,关键在于实例化新对象时所调用的是哪个子类的构造,如果方法被子类所覆写,调用的就是覆写过的方法,否则就调用父类中定义的方法。

下面观察向下转型:

public class Demo02{
    public static void main(String[] args){
        A a = new B(); //实例化子类对象并向上转型
        B b = (B)a; //强制向下转型
        b.print();//结果是:B的print
    }
} 
public class Demo03{
    public static void main(String[] args){
        A a = new A(); //直接实例化父类对象
        B b = (B)a;   //强制向下转型,产生”ClassCastException”异常
        b.print();   //此语句无法执行
    }
} 

上面可以看出向下转型是有前提条件的,即必须发生向上转型后才可以发生向下转型。如果是两个没有关系的类对象发生强制转换,就会出现”ClassCastException”异常。所以向下转型是有安全隐患的,可以通过instanceof运算符判断对象是否属于某个类来进行向下转型。

public class Demo03{
    public static void main(String[] args){
        A a = new A(); //直接实例化父类对象
       if(a instance of B){
           B b = (B)a;
       }else{
           System.out.println("类型不符,不能向下转型。");
       }
    }
} 

对象多态的作用

在实际开发中,对象向上转型的主要意义在于参数的统一,也是最主要的用法,而对象的向下转型指的是调用子类的个性化操作方法。

class A {
    public void print(){
        System.out.println("A的print");
    }
}
class B extends A{  //定义A的子类
    public void print(){ //子类覆写了父类的方法
        System.out.println("B的print");
    }
}
class C extends A{  //定义A的子类
    public void print(){ //子类覆写了父类的方法
        System.out.println("C的print");
    }
}
public class TestPolymorphic{
    public static void main(String[] args) {
        fun(new B()); //向上转型,等价于A a = new B();
        fun(new C()); //向上转型,等价于A a = new C();

    }
    //接收A类和其子类对象,不管传递哪个对象都要求调用print()方法
    public static void fun(A a){
        a.print();
    }
}

上面程序的fun()方法接收一个A类的实例化对象,按照对象的向上转型原则,此时的fun()方法可以接受A类对象或所有A类的子类对象,这样只需要一个A类的参数类型,此方法就可以处理一切A类的子类对象。

动态绑定

标签:对象,子类,多态,转型,print,父类,public
来源: https://www.cnblogs.com/yellowchives/p/15194793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有