多态

多态

一娘生九子,九子九个样,生活中的多态。 动物,猫,狗,吃食物,猫吃鱼,啃骨头,动物界的多态。

1、java的多态
多态是java 面向对象的三大特征之一。
是指同一行为,具有多个不同表现形式。这句话的缺点,未讲清多态的结构。
属于同一类型的不同的对象,在运行时其行为表现出不同的形态。
2、实现多态的例子
我需要一个狗的对象,代码就这样写:

Dog dog = new Dog();//这样创建dog的对象并未体现出多态特征
dog.eat();
   //如果是多态的写法,代码就这样写:
Animal dog  = new Dog();
Animal cat = new Cat();
dog.eat();
cat.eat();

3 、多态的好处
主要是为了让程序具有更大的扩展性。

public static void animalEat(Animal animal){
    animal.eat();
}
Dog dog  = new Dog();
Animal cat = new Cat();

animalEat(dog);
animalEat(cat);

Usb mouse = new Mouse();
Usb keyBoard = new KeyBoard();
public static void usbConnect(Usb dev){
    dev.connect();
}

3、实现多态的基本条件

  1. 继承或者实现【二选一】
  2. 方法的重写【意义体现:不重写,无意义】,也包括接口方法的实现
  3. 父类引用指向子类对象【格式体现】
    4、多态的实现原理
    Java程序的执行过程中包含了两个基本步骤,第一是源程序编译成字节码文件,第二是字节码文件被JVM加载执行。因此java的程序就可以分为编译期(源程序正在被编译的过程中)和运行时(程序正在内存中运行)两种状态。
    (1)在编译期,如果程序中创建了一个对象,编译器会去确定对象的类型是什么,比如:Dog dog = new Dog();编译器只看前面的Dog dog,因此它认为dog对象的类型是Dog.Animal dog = new Dog();编译器认为它的类型就Animal。
    (2)在运行时,Animal dog = new Dog();这行同样的代码,执行器它判断dog对象的类型看的是后面, new Dog(),因此运行时dog的类型是Dog();
    (3)在编译器,只要是父类型所拥有的方法,都可以在对象上调用,因此,只要程序中调用的是父类型所拥有的方法,编译器不会报错。
    (4)编译器会把编译期所确定的对象的类型传递到运行时
    (5)在运行时,当对象执行方法时,因为执行器确定对象属于子类型,因此执行的是子类型的方法,也就是为什么声明为Animal 类型的对象在执行的时候调用 的是Dog的方法。
    5、在多态情况下,属于子类自已的方法将不能被执行。这是多态的缺点,但此缺点掩盖不了多态的光茫。

6、引用类型的转换
前面学习过基本类型的转换,转换的原则是弱类型转强类型是自动转换,强转弱是强制转换。
引用类型同样存在类型转换,它建立在继承和实现的基础之上,子类型转换为父类型为自动转换,相反,父类型转换为子类型为强制转换。
(1)Instanceof 语句,它用来判断对象的实现类型。

boolean b = mouse instanceof Usb;//语句解读,对象是某类的实例吗?返回布尔值
boolean b = mouse instanceof Mouse;//语句解读,对象是某类的实例吗?返回布尔值
boolean b = mouse instanceof KeyBoard;//语句解读,对象是某类的实例吗?返回布尔值

以上执行结果分别 是 true true false
以上代码说明mouse既是父亲Usb的对象,也是自身Mouse的对象,但它与实现了同一接口的keyBoard只是兄弟关系,不具有继承和实现的关系,因此mouse不可能是KeyBorder的对象.
(2)自动类型转换
引用类型的变量的类型可以直接转换为它的父类型或接口类型。自动转换的语法是:直接把变量赋值给父类型的变量

    //把mouse转换为 Usb类型
Usb m = mouse;
//其实底层作了一个判断, mouse instanceof Usb;

(3)强制类型转换
把父类型转换为子类型,转换语法:父类型 子类型对象变量 =(子类型)父类型的对象变量

    //把父类型转换为子类型,可是子类型只能在运行时才能确定,编译器报错,因此要执行强制转换
Mouse m = (Mouse)mouse;

7、向上转型
用父类型声明子类型的对象。把子类型转换为父类型也就是自动转换。
Animal dog = new Dog();
8、向下转型
把父类型转换为子类型的对象,属于强制转换。
这种情况可能会抛异常,把某种类型转换为与它不相干的类型,在运行时会产生异常。

Usb mouse = new Mouse();
KeyBoard keyBoard = (KeyBoard) mouse;
keyBoard.connect();

java.lang.ClassCastException: com.wang.Mouse cannot be cast to com.wang.KeyBoard,在运行时抛出类型转换异常。原因在于,执行时会用
Instanceof 去判断mouse对象是否属于KeyBorder类型,如果结论是false则抛出此异常。根源在于KeyBorder与Mouse不具有继承和实现的关系。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值