黑马程序员--03.Java面向对象--07.【多态】【instanceof操作符】
2013-07-20 11:56
633 查看
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 instanceofBa:是某个类型的实例的引用变量
B:某个类的类名
(2). 用途:用于判定引用变量a指向的实例是否是类型B的一个实例
(3). instanceof 是一个操作符,返回值是boolean类型的值
2). 使用场景
[1]. 如果一个类的子类类型很少,可以用instanceof操作符来判断指向子类实例的父类引用是否是父类的一个实例。instanceof引用到多态中[2]. 当这个父类的子类类型很多的时候,instanceof使用起来是比较麻烦的,因为需要亲自列出很多判断。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
相关文章推荐
- 黑马程序员--03.Java面向对象--08.【多态中成员的特点】
- 黑马程序员_Java基础_03面向对象思想(对象转型注意事项、多态、抽象类、final关键字等)
- 黑马程序员_java基础笔记(03)...面向对象
- 黑马程序员--03.Java面向对象--03.【工具类】【静态代码块】
- 黑马程序员_java基础笔记(03)...面向对象
- 黑马程序员——Java面向对象(二)之封装、继承、多态、接口等
- 黑马程序员-----java入门一DAY10------类的设计分析 面向对象多态 构造代码块
- 黑马程序员——Java语言基础——03.面向对象(3)异常
- 黑马程序员_java面向对象总结【3】(继承、接口和多态)
- 黑马程序员_java面向对象_多态和异常
- 黑马程序员--03.Java面向对象--05.【继承】【子父类中成员的特点】【子父类中构造函数的特点】
- 黑马程序员——Java面向对象(二)—继承、final、多态
- 黑马程序员--03.Java面向对象--01.【OOP基本概念】【匿名对象】【封装】【构造函数】【this关键字】
- 黑马程序员--03.Java面向对象--05.子类对象初始化的过程【个人总结】
- 黑马程序员——Java面向对象封装继承多态
- 黑马程序员_java基础3-面向对象(二)多态、异常、包
- 黑马程序员 java 基础 毕向东 面向对象 多态
- 黑马程序员--03.Java面向对象--02.【static关键字】【main方法】【静态成员】
- 黑马程序员——Java面向对象之继承与多态笔记
- 黑马程序员——第八天(Java面向对象-多态)