美文网首页程序员
关于向上转型和方法多态

关于向上转型和方法多态

作者: nemuni | 来源:发表于2018-02-04 22:37 被阅读0次

一直以来我都不太明白为什么大家的代码中创建一个ArrayList对象都是用

List<A> temp = new ArrayList<A>();

所以今天来整理一下向上转型的。。实际效果!
首先看一段简单的代码:


public class test extends A {
  public int a = 2;

  public int getNum() {
  return a;
  }

  public int getNew() {
    return 3;
  }

public static void main(String[] args) {
    A temp = new test();
    System.out.println(temp.a);
    System.out.println(temp.getNum());
    //System.out.println(temp.getNew());
  }
}

class A{
  public int a = 1;

  public int getNum() {
  return a;
  }
}

输出结果为

1
2

结果很明显,调用相同名字的属性(变量)结果取决于引用类型,即A,当然由于封装的关系一般不会用到这一点。
而方法则要看引用的实际类型,即test。而如果把main中第四行的引用去掉,则会报错。我的理解是引用类型为父类时,只能调用父类中声明的方法,不过实际调用时会从引用变量的实际类型入手开始检查方法名,子类没有重写则检查父类直到找到方法为止,这就是Java特性中多态的方法多态

那这有什么用呢?从上面的效果可以看出,因为正常情况下我们会对类进行封装,所以对属性的引用的特点我们无需管。所以使用场景多是运用方法多态。

abstract class A{
  static int getNum(A temp) {
    return temp.createNum();
  }

  protected abstract int createNum(){}
}

对于方法getNum(A temp),参数可以接收所有A的子类型去调用子类型中各自实现不同的的createNum()。

对上面的情况使用这一特性可以减少代码量,还有另外的使用场景是Java设计模式-装饰器模式Java设计模式-策略模式,唔。。应该还有很多使用场景,后续看到会补充进来。

还有另外一种情况,当我们定义了

List<A> temp = new ArrayList<A>();
当我们不需要这个ArrayList而需要temp指向一个LinkedList时,可以直接
temp = new LinkedList<A>();
避免了再定义一个变量,节约了内存和分配空间的时间。

在上面的使用场景中向上转型增强了适应性,套路也大同小异;当然对于需要调用一些子类中特有的方法的场景,我们可以不使用向上转型或进行向下转型(强制类型转换)。

相关文章

  • 关于向上转型和方法多态

    一直以来我都不太明白为什么大家的代码中创建一个ArrayList对象都是用 List temp = new Ar...

  • java多态(重要O!)

    一、多态的语法 关于java语言中的向上转型和向下转型 1、向上转型(upcasting):子 -->父 2、向下...

  • 12.多态中的向上转型和向下转型

    多态中向上转型与向下转型 多态的转型分为向上转型与向下转型两种: A:向上转型:当有子类对象赋值给一个父类引用时,...

  • 2020-02-20 Java 面向对象的多态性

    1.多态性的体现: 方法的重载和重写 对象的多态性 2.对象的多态性: 向上转型:程序会自动完成。...

  • 第二十九节:Java基础知识-类,多态,Object,数组和字符

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,O...

  • Java学习笔记 (一)

    多态性 方法的重载与覆写 对象的多态性①.向上转型:子类对象→父类对象 (自动完成)②.向下转型:父类对象→子类对...

  • java049多态的转型和优缺点及包

    1.多态中的向上转型和向下转型 引用类型之间的转换: 向上转型:由小到大(子类转换成父类) 向...

  • 多态中的向上转型与向下转型

    在讨论向上转型和向下转型之前,先复习下多态。如果有错误的地方,希望能够指出,大家共同进步! 什么是多态? 多态(P...

  • 多态性

    对象的多态性只适用于方法,不适用于属性(编译和运行都看左边) 向上转型 / 向下转型 使用强转时可能出现Class...

  • java的多态性

    1、需有父子类关系,子类通过extends继承父类; 2、java多态性分为向上转型以及向下转型。 向上转型:...

网友评论

    本文标题:关于向上转型和方法多态

    本文链接:https://www.haomeiwen.com/subject/hfyvzxtx.html