黑马程序员--03.Java面向对象--07.【多态】【instanceof操作符】

Java面向对象--7

      多态 instanceof操作符(关键字)

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1.    多态基本使用

多态可以理解为:事物存在多种体现形态

1). 多态的基本体现

(1). 父类引用指向了子类的对象

(2). 父类引用作为函数的参数,可以接收子类对象

e.g.

class Animal{}
class Cat extends Animal{}
class Dog extends Animal{}

Animal ani =newCat();

从这句的语义理解:把猫传给一个动物的名字,说明这个猫也是动物的一种。(多种形态)

*******************************************************************************

但是反过来:

Cat cat =new Animal();

把动物传给一个猫的名字,说明这个动物也是猫的一种,不符合实际意义,编译出错。

2). 多态使用的前提

(1). 前提I:类和类或者类和接口之间存在关系

[1]. 类之间要么有继承关系

[2]. 要么类实现接口

(2). 前提II:在前提I的基础之上,类之间/类和接口之间的方法存在关系

存在类之间的继承关系或者类实现了接口之后,子类必须还覆盖了父类或者接口中的相应的方法

3). 多态的好处和弊端

[1]. 多态的好处:多态大大提高了程序的可扩展性

[2]. 多态的弊端父类引用指向了子类的实例,这时候使用父类的引用只能访问子类从父类继承或者重写的成员,而不能通过父类的引用调用子类特有的成员

4). 使用多态的注意事项

(1). 向上转型和向下转型

[1]. 向上转型:把子类实例赋值给父类引用 (也就是父类引用指向了子类实例)

       向上转型可以通过Java自动完成。

[2]. 向下转型:把父类引用强制转换子类引用

       向下转型通过手动强制类型转化来完成,如果不进行强制类型转换,会编译报错。

【注意】多态自始至终都是将子类的堆内存对象做着变化

不建议:把父类实例强制转换赋值给子类引用。

***********这样做,编译能通过(符合语法规则就能通过),但是运行时候,直接抛出ClassCastException异常!!!***********

举例:

class Animal{
    public void show(){
        System.out.println("Show Animal");
    }
}
class Cat extends Animal{
    public void show(){
        System.out.println("Show Cat");
    }
}
class Dog extends Animal{
    public void show(){
        System.out.println("Show Dog");
    }
}
 
public class TestAnimal{
    public static void main(String[] args) {
        Animalani =new Cat();
        Cat  cat=(Cat)new Animal();//子类引用指向了父类的实例,Javac通过!!
        cat.show();
    }
}

运行的时候,cat.show();抛出了异常:


2.    instanceof操作符

1). 用途

(1). 使用格式:a instanceofB

       a:是某个类型的实例的引用变量

       B:某个类的类名

(2). 用途:用于判定引用变量a指向的实例是否是类型B一个实例

(3). instanceof 是一个操作符,返回值是boolean类型的值

2). 使用场景

[1]. 如果一个类的子类类型很少,可以用instanceof操作符来判断指向子类实例的父类引用是否是父类的一个实例。instanceof引用到多态中

[2]. 当这个父类的子类类型很多的时候,instanceof使用起来是比较麻烦的,因为需要亲自列出很多判断。

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值