《黑马程序员》java笔记->【03】关于多态

 

-------  android培训java培训、期待与您交流! ----------


/**
关于多态:

多种形态。

这里重点讲的就是对象的多态

      狗 x=new  狗();
//狗类型,引用狗对象

      动物 y=new 狗();
//动物类型,引用狗对象         对象的多态性,狗对象即是狗类型,又是动物形态

必须明确一点:狗是动物中的一种。
意味着狗是需要继承动物的才可以这样指向

多态性:在程序中的体现。
  就是:父类或者接口的引用指向自己的子类对象。

好处:提高了代码的扩展,只要继承了就可以用
弊端:前期建立父类的引用虽然可以接受后期所有该类的子类对象
      但是只能使用父类中的功能,不能使用子类的特有功能
      因为前期的程序无法知道后期的子类的特有内容的。

      但是前期的程序可以使用子类覆盖了父类的方法的内容。

前提:1必须存在继承关系
      2通常要有覆盖操作。 

*/
//抽象类Animal
abstract class Animal
{
 abstract void eat();
}
class Dog extends Animal
{
 public void eat()
 {
  System.out.println("狗:吃骨头");
 }
 public void println()
 {
  System.out.println("看家");
 }
}
class Cat extends Animal
{
 public void eat()
 {
  System.out.println("猫:吃鱼");
 }
 public void catchMouse()
 {
  System.out.println("抓老鼠");
 }
}
class Pig extends Animal
{
 public void  eat()
 {
  System.out.println("猪:饲料");
 }
 public void gongDi()
 {
  System.out.println("拱地");
 }
}
class Demo35
{
 public static void main(String[] args)
 {
  Dog d=new Dog();
  Cat c=new Cat();
  method(d); 
  //这个d只能指向狗
  //调用Dog类的所有方法
  Dog d=new Dog();
 
  //这个d即可以指向狗,猫也可以指向任何Animal的子类对象。。类型提升
  //只能调用Dog类继承的Animal类的方法。。
  Animal d=new Dog();
  /**
  Dog a=(Dog)d; 向下强制转型为子类
  如果类型转换错误,会出现运行异常(不是编译失败)如:Cat a=(Dog)d 把Dog转成了猫

向上转型Animal d=new Dog():当需要对程序进行扩展,或者限定对象的方法操作时,使用向上转型。即操作其父类
向下转型Dog a=Dog(d)   :当需要使用子类的特有内容时,就需要向下转型,转型前一定要判断,否则易出问题
注意:在这个转换过程中,自始至终都是一个子类对象在做着类型的变化而已。
      千万别把父类对象转成子类型,那是不可能的
    例如:
  Animal a=new Animal();
  Dog d=(Dog)a;
  错误
  */

  
 }

 //同一处理多个对象共有特性行为,多态好处
 public static void method(Animal s)//Animal s=new s类();
 {
  s.eat();
  /**
  s.catchMouse();出现错误,动物类型抽象Animal类中无此方法
  需要进行强制向下转型,才能使用子类的方法,
  主函数里边的是多态对象才可用:Anima a=new cat(); 并且属于Cat类
  否则出先类型转换异常
  */
  
  /**
  在进行子类特有方法使用时,要进行向下转型
  转型前一定要判断。否则编译正常,运行异常容易发生ClassCastException

  判断引用类型,要使用关键字完成。关键字:instaceof

  对象 instaceof 类型
  */
  if(a instance of Cat)
  {
   Cat c=(Cat)a;
   c.catchMouse();
  }
  else if(a instanceof Dog)
  {
   Dog d=(Dog)a;
   d.lookHome();
  }
  else if(a instanceof pig)
  {
  }
  else if(……)
  {
   ……
  }
  else
   ……
 }


 /*
 此方法麻烦,所有用多态
 public static void method(Dog d)
 {
  d.eat();
 }
 public static void method(Cat c)
 {
  c.eat();
 }
 */
}
---------------
向上向下转型练习


class 毕姥爷
{
 void 讲课()
 {
  System.out.printl("管理");
 }
 void 钓鱼()
 {
  System.out.println("钓鱼");
 }
}
calss 毕老师 extends 毕姥爷
{
 //继承父类 讲课()方法并修改
 void 讲课()
 {
  System.out.printl("java");
 }
 void 看电影()
 {
  System.out.println("看电影");
 }
 /**
        不用写继承的父类方法,因为不是抽象方法
 void 钓鱼()
 {
  System.out.println("钓鱼");
 }
 */
 
 
}
class DuoTaiDemo2
{
 public static void main(String[] args)
 {
  毕姥爷 x=new 毕老师();//向上转型
  x.讲课();
  x.钓鱼();
  毕老师 y=毕老师(x);//向下转型
 }
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值