Java中多态以及向上转型和向下转型

来源:互联网 发布:淘宝店装修怎么弄 编辑:程序博客网 时间:2024/06/05 17:03
     多态三种表现形式:
      1.重写(override):子类有一个和父类一模一样的方法就构成了重写,可以在子类的这个方法中对父类进行加强

      2.重载(overload)
           类中有许多个一模一样的方法名,它们的形参的数量或类型不一样,和返回类型没有任何关系,就构成了重载
           降低了代码复杂度,有利于代码
           拓展
     
     3. 子类可以产生父类对象

一、使用父类类型的引用指向子类的对象;通过将子类对象引用赋值给父类对象引用变量来实现动态方法调用。
二、该引用只能调用父类中定义的方法和变量;  如果要调用子类中独有的方法则需要向下转型(向下转型是危险的,在泛型中运用表较多)
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)  
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
注意:不能把父类对象引用赋给子类对象引用变量 ,
在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行。
记住一个很简单又很复杂的规则一个类型引用只能引用引用类型自身含有的方法和变量。  
你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。  其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个方法在父类中并没有定义,则会出错
 
举一个鸡的例子,

鸡是所有其它鸡的基类, 定义了一个方法shape(), 此方法能指明鸡的形态. 所有的子类[火鸡,山鸡,田鸡等],都有这个shape方法, 表明自己的形态,

如果用下面的方法定义我需要具体的鸡,

[基类 引用 =  实现类的对象]


for example:

鸡 a = new 火鸡();

鸡 a = new 田鸡();

鸡 a = new 山鸡();

鸡 a = new 母鸡();



当我使用的时候, 我采用 a 这个引用,

a.shape(), 就会得到鸡的形态.

如果我定义的是

鸡 a = new 火鸡();

那么a.shape得到的是火鸡的形态, 而不需要用具体的

火鸡 a = new 火鸡(); 再通过a.shape得到火鸡的形态
0 0
原创粉丝点击