Day11多态部分-6 【1.3 对象的向上转型和向下转型】

来源:互联网 发布:待遇好的建筑公司知乎 编辑:程序博客网 时间:2024/06/05 02:00

【1.3 对象的向上转型和向下转型】

  • + -

    向上转型

    子类对象赋值给父类类型的引用时 会自动将子类对象对应的类型

    提升为父类类型

    语法:

    父类类型 引用 = new 子类的构造方法();

    特点:

    此时 该引用只能调用父类中所有可见的属性和方法

    不能调用子类特有的属性和方法

    向下转型

    将父类对象引用强制转为子类类型的过程

    语法:

    子类类型 引用 = (子类类型)父类对象引用;

    特点:

    1.此时 该引用可以调用子类特有的方法,同时还可以调用从父类中继承过来的所有方法

    2.在进行强制类型转换之前,一定要使用instanceof关键字判断一下 否则运行时很容易抛出"ClassCastException" 类型强制转换异常

    java.lang.ClassCastException 类型制转转换异常;

    【instanceof 运算符】 用来在运行时 指出对象是否是特定类型的一个实例

    【instanceof 语法】: 对象  instanceof  类型

    【结果是boolean类型】:

    true: 对象属于该类型

    false: 对象不属于该类型

    • + -

      /* Animal1 c = new Cat1(); //有个人来给你爸爸去讲课 讲电工培训,

      但爸爸不在,我又想挣这钱,就易容成我爸爸,

      show(c);//然后去讲课,我只会讲java培训,问讲的是什么课?

      还是Java因为实际讲课人是我;

      Dog1 dd =(Dog1 ) d;//现在女友来找逛街,

      但我此时还是易容成我爸爸的样子,

      现在偷偷要去卸妆才出来

      * dd.show2();//然后和女友逛街

      */

      /*

      一个儿子经过化妆成了父亲,但他实际上还是儿子,

      那么他做的事(行为),是儿子做的呢?还是父亲做的呢?

      显然还是儿子,化了妆的儿子,必须先从'父亲'卸妆成儿子

      ,才能干儿子特有的事(行为)

      */

      • + -

        public static void main(String[] args) {

        Animal1 c = new Cat1();

        show(c);

        /*ClassCastException" 类型强制转换异常 

         Day11.Dog1 cannot be cast to Day11.Cat1 Day11。

        狗1不能被扔到Day11.Cat1

        Dog1  dd  = (Dog1) d;  

        show(d);*/

        Animal1 d =  new Dog1();

        show(d);

        Animal1 p = new Pig1();

        show(p);

        }

        public static void show(Animal1 tmp){//1.进来的是Animal1的引用

        tmp.eat();

        // Cat1 t = (Cat1) tmp;//(向下转型 )2.转成Cat1的引用

        // t.show1();//3.再调Cat1特有的功能

        if(tmp instanceof Cat1){//如果tmp进来的是猫就

        Cat1 t = (Cat1) tmp;

        t.show1();

        }else if(tmp instanceof Dog1){//否则 如果进来的是狗就

        Dog1 d =(Dog1) tmp;

        d.show2();

        }else if(tmp instanceof Pig1){

        Pig1 p =(Pig1) tmp;

        p.show3();

        }

        }

        • package Day11;

          public class Test_03 {

          public static void main(String[] args) {

          // Manager m =new Manager("000","小");

          // m.work();

          // m.managerwork();

          Employee manager = new Manager("001", "张三丰");

          Employee sales = new Sales("002", "欧拉");

          Test_03 boss =new Test_03();

          boss.show(manager);

          boss.show(sales);

          }

          public static void show(Employee tmp) {// 在Main里普通方法要加static

          System.out.println("工号" + tmp.getWorkId());

          tmp.work();

          if (tmp instanceof Manager) {

          Manager m = (Manager) tmp;

          m.managerwork();

          // tmp.setName("黎经理");

          // ((Manager) tmp).managerwork();

          } else if (tmp instanceof Sales) {

          Sales n = (Sales) tmp;

          n.sale();

          // tmp.setName("黄经理");

          // ((Sales) tmp).managerwork();

          }

          }

          }

          class Employee {

          private String workId;// workid

          private String name;

          public Employee() {// 无参构造没有void只有public

          super();// 不写也是默认存在的

          }

          public Employee(String workId, String name) {

          super();// 不写也是默认存在的

          this.workId = workId;

          this.name = name;

          }

          public void setWorkId(String workId) {

          this.workId = workId;

          }

          public String getWorkId() {

          return workId;

          }

          public void setName(String name) {

          this.name = name;

          }

          public String getName() {

          return name;

          }

          public void work() {

          System.out.println("员工都要开会!");

          }

          }

          class Manager extends Employee {// 经理

          public Manager() {// 无参

          super();

          }

          public Manager(String workId, String name) {// 有参

          super(workId,name);

          }

          public void managerwork() {

          System.out.println("经理[" + getName() + "],管理普通员工");

          }

          }

          class Sales extends Employee {// 销售

          public Sales() {// 无参

          super();

          }

          public Sales(String workId, String name) {// 有参

          super(workId,name);

          }

          public void sale() {

          System.out.println("销售部的[" + getName() + "],销售业绩排第一");

          }

          }     

阅读全文
0 0