20.面向对象-----多态性

2020-03-29 16:01:54来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

20.面向对象-----多态性

一、多态性的理解

  一个事物的多种形态。

二、对象的多态性

  父类的引用指向子类的对象。

例如:

Person p = new Man();//Man是Person的子类

Object obj = new Date();

说明:

  Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边;运行时,看右边。如果编译时的类型和运行时的类型不一致,就出现了对象的多态性。  

举例:

public class test {
    public static void main(String[] args) {
        Animal animal = new Cat();
        //实际执行的是子类重写后的eat()
        animal.eat();
    }
}

class Animal{
    String name;
    int age;

    public void eat(){
        System.out.println("动物进食");
    }
}

class Cat extends Animal{
    public void eat(){
        String ability;

        System.out.println("猫类进食");
    }
}

三、虚拟方法调用

  子类继承父类以后,对父类中的方法进行类重写。实例化父类的引用执行子类的对象(多态性),在编译器,只能调用父类中声明的方法,但是在运行期,实际执行的是子类重写父类的方法。

四、多态性使用的前提

①子父类继承关系;

②子类重写父类的方法;

 

注意:

  多态性的使用仅适用于方法,不适用于属性。

五、动态绑定

编译时看左边,运行时看右边。

六、向上转型和向下转型

1.向上转型:多态性

2.向下转型

问题的引入:

  有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。如何才能调用子类特的属性和方法?使用向下转型。

如何实现向下转型?

使用强制类型转换符:()

七、instanceof的使用

在使用向下转型的过程中,可能出现ClassCastException的异常。因此,在进行强转之前,要使用instanceof判断某个对象是否是某个类的实例。如果返回true,就进行向下转型;如果返回false,不进行向下转型。

如何使用?

a instanceof A:判断对象a是否是类A的实例。

如果B是A的父类,a instanceof A返回true,则a instanceof B也返回true。

图示:

 

 

public class test {
    public static void main(String[] args) {
        Person p = new Student();
        if (p instanceof Person){
            Student s = (Student)p;
            s.major = "英语";
            System.out.println(s.major);//英语
        }else{
            System.out.println("不匹配的类型");
        }
    }
}

class Person{
    String name;
    int age;

    public void eat(){
        System.out.println("人吃饭");
    }

    public void sleep(){
        System.out.println("人睡觉");
    }
}

class Student extends Person{
    String major;

    public void eat(){
        System.out.println("学生吃饭");
    }

    public void study(){
        System.out.println("学生努力学习知识");
    }
}

 

 

作者:Java之美

日期:2020-03-29


原文链接:https://www.cnblogs.com/897463196-a/p/12592494.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:java~线程池的总结~续

下一篇:17.面向对象-----方法的重写