Chinaunix首页 | 论坛 | 博客
  • 博客访问: 534980
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 15:17
个人简介

用发呆的时间来理清自己的思绪

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: Java

2014-08-03 18:07:15

对于多态,可以总结它为:       

一、使用父类类型的引用指向子类的对象;

二、该引用只能调用父类中定义的方法和变量;

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

多态的3个必要条件:

1.继承   2.重写   3.父类引用指向子类对象。

多态的规则

1.当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;

2.如果有,再去调用子类的该同名方法

注意此处:静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。  

3. 如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如下面的例子中,将animal_01转换为子类cat类型的引用。因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。

注意:向上类型的转换是自动的,向下类的转换不是自动的,需要程序员手动进行转化。

代码如下:

点击(此处)折叠或打开

  1. package com;

  2. public class Polymorphic {

  3.     /**
  4.      * @param args
  5.      */
  6.     public static void main(String[] args) {
  7.         // TODO Auto-generated method stub
  8.         
  9.         //向上类型的自动转换
  10.         Dog dog = new Dog();
  11.         Animal animal = null;
  12.         animal = dog;
  13.         animal.eat();
  14.         

  15.         //向下类型转换
  16.         Animal animal_01 = new Cat();
  17.         Cat cat = (Cat)animal_01;
  18.         cat.eat();
  19.         cat.CatMouse();
  20.         
  21.         //用父类引用调用父类不存在的方法,会编译出错,向下类型转化是是强制进行;
  22. //        Animal animal_02 = new Cat();
  23. //        animal_02.CatMouse();
  24.         
  25.         //Pig类没有重写父类的方法,因此调用时调用的都是父类的方法
  26.         Pig pig = new Pig();
  27.         pig.eat();
  28.         
  29.     }

  30. }

  31. class Animal
  32. {
  33.     public void eat()
  34.     {
  35.         System.out.println("all animals have the The act of eating");
  36.     }
  37. }
  38. class Dog extends Animal
  39. {
  40.     public void eat()
  41.     {
  42.         System.out.println("Dog eats meat");
  43.     }
  44. }

  45. class Cat extends Animal
  46. {
  47.     public void eat()
  48.     {
  49.         System.out.println("Cat eats mouse");
  50.     }
  51.     public void CatMouse()
  52.     {
  53.         System.out.println("cat can catch mouse");
  54.     }
  55. }

  56. class Pig extends Animal{}
运行结果:

点击(此处)折叠或打开

  1. Dog eats meat
  2. Cat eats mouse
  3. cat can catch mouse
  4. all animals have the The act of eating

阅读(800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~