Java注意事项(4)

一、多态

1、基本介绍

方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的
2、多态的具体体现
1) 方法的多态 
重写和重载就体现多态
2) 对象的多态 ( 核心,困难,重点 )
Java注意事项(4)_第1张图片

 

3、多态案例

 

 4、多态注意事项和细节讨论

多态的 前提是 :两个对象 ( ) 存在继承关系
多态的向上转型
Java注意事项(4)_第2张图片

 多态的向下转型

Java注意事项(4)_第3张图片

向上转型 : 父类的引用指向了子类的对象
// 语法:父类类型引用名 = new 子类类型 ();
Animal animal = new Cat();
Object obj = new Cat();// 可以吗 ? 可以 , Object 也是 Cat 的父类
// 向上转型调用方法的规则如下 :
(1) 可以调用父类中的所有成员 ( 需遵守访问权限 )
(2) 但是不能调用子类的特有的成员
(3) 因为在编译阶段,能调用哪些成员 , 是由编译类型来决定的
animal.catchMouse(); 错误
(4) 最终运行效果看子类 ( 运行类型 ) 的具体实现 , 即调用方法时,按照从子类 ( 运行类型 ) 开始查找方法
,然后调用,规则我前面我们讲的方法调用规则一致。
// 多态的向下转型
(1) 语法:子类类型 引用名 = (子类类型)父类引用 ;
问一个问题 ? cat 的编译类型 Cat, 运行类型是 Cat
Cat cat = (Cat) animal;
cat.catchMouse();// 猫抓老鼠
(2) 要求父类的引用必须指向的是当前目标类型的对象

 

5、instanceOf

instanceOf比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型

例:

System.out.println(bb instanceof BB);// true
System.out.println(bb instanceof AA);// true
//aa 编译类型 AA, 运行类型是 BB
//BB AA 子类
AA aa = new BB();
System.out.println(aa instanceof AA);
System.out.println(aa instanceof BB);
Object obj = new Object();
System.out.println(obj instanceof AA);//false
String str = "hello";
//System.out.println(str instanceof AA);
System.out.println(str instanceof Object);//true
6、Java的动态绑定机制
Java注意事项(4)_第4张图片

 

代码 

public class DynamicBinding {
    public static void main(String[] args) {
    
    //a 的编译类型 A, 运行类型 B
    A a = new B();//向上转型
    
    System.out.println(a.sum());//?40 -> 30
    System.out.println(a.sum1());//?30-> 20
    }
}

class A {//父类
    public int i = 10;
    //动态绑定机制:
    public int sum() {//父类 sum()
        return getI() + 10;//20 + 10
    }
    
    public int sum1() {//父类 sum1()
        return i + 10;//10 + 10
    }
    
    public int getI() {//父类 getI
        return i;
    }
}

class B extends A {//子类
    public int i = 20;
    // public int sum() {
        // return i + 20;
    // }
    
    public int getI() {//子类 getI()
        return i;
    }
    
    // public int sum1() {
        // return i + 10;
    // }
}

7、多态的应用
) 多态数组
数组的定义类型为父类类型,里面保存的实际元素类型为子类类型
应用实例 : 现有一个继承结构如下:要求创建 1 Person 对象、 2 Student 对象和 2 Teacher 对象 , 统一放在数组中,并调用每个对象say 方法 .
应用实例升级:如何调用子类特有的方法,比如 Teacher 有一个 teach , Student 有一个 study
2) 多态参数
Java注意事项(4)_第5张图片

 

你可能感兴趣的:(开发语言,java,intellij-idea)