JAVA向上转型和向下转型(一)

时间:2023-02-25 18:22:08

   在我们工作的时候通常会看到这样的代码:

   Map<String,Object> m = new HashMap<String,Object>();

   List<Object> l = new ArrayList<Object>();


   question1: m和 l 是 对象吗?不要急于回答问题,请看下面两行代码:


    Human human;

    human = new Human("亚当");

   这两行代码等同于:Human human = new Human("亚当");


   question2:我们知道在Java中new是用来在堆上创建对象用的,如果human是一个对象的话,为什么还要再通过new来   创   建呢?如果不是对象,那么human是什么?如同question1中所问: m和l是什么?OK! 有点迷惑吧(大牛请忽略!!!),来跟着我把下面一段话读一遍:


“每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。”——《JAVA编程思想》

 

 错,m、l和 human 不是对象,他们是对象的引用变量,human是指向“亚当”对象(Human 类的一个实例)的引用。他们不在堆中,一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。

 

  现在我创建一个两个类 Man和 Woman  继承 Human。请看下面代码:

  Human  h

  h = new Man("亚当")

  创建了一个 Human的引用 h 然后又将h指向了一个Man对象的实例(亚当);一个父类引用指向了一个子类对象,也就是说把子类转化成了父类来用,这就叫做“向上转型”。   什么是向下转型呢?

 向下转型:父类引用的对象转换为子类类型称为向下转型。请看向下转型的例子:

  1. Man m = (Man) h;

  2. Human h1 = newHuman("夏娃");

  3. Woman m = (Woman)h1;

 

 

 未完待续!!!