您的位置:首页 > 职场人生

黑马程序员--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 instanceofB

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

       B:某个类的类名

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

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

2). 使用场景

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

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

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐