Java多态性(向上转型、向下转型)

多态

在Java中,对于多态的核心表现主要有一下两点:

1.1 方法的多态性

  ①. 方法的重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体。
  ②. 方法的覆写:同一个父类的方法,可能根据实例化子类的不同也有不同的表现形式。

1.2 对象的多态性(抽象类和接口)

1.2.1 对象的向上转型

  对象的向上转型:父类 父类对象 = 子类实例

class Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是人");
    }
}
class Student extends Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是学生");
    }
}
public class Test{
    
    
    public static void main(String[] args)
    {
    
    
        //向上转型 父类 父类对象 = 子类实例
        Person per = new Student();
        per.print();
    }
}

在这里插入图片描述
  不管是否发生了向上转型,核心的本质还是在于:你使用的是哪一个子类(new 在哪里),而且调用的方法是否被子类所覆写了。为什么要发生向上转型?用于参数统一化,假设父类有n个子类,方法要接受子类的实例,如果没有向上转型,就需要定义n个方法接收不同的对象

1.2.2 对象的向下转型

  对象的向下转型:子类 子类对象 = (子类)父类实例
  向下转型指的是将父类对象变为子类对象,但是在这之前我们需要明确为什么要发生向下转型?当父类需要调用子类的扩充方法时,才需要向下转型

class Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是人");
    }
}
class Student extends Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是学生");
    }
    public void fun()
    {
    
    
        System.out.println("开心的一天!");
    }
}
public class Test{
    
    
    public static void main(String[] args)
    {
    
    
        //向上转型 父类 父类对象 = 子类实例
        Person per = new Student();
        /**
        运用向上转型后,此时若想访问子类中的fun方法是不可以的,
        所以就有了向下转型。
         */
        Student stu = (Student)per;
        stu.fun();
    }
}

在这里插入图片描述
  向下转型之前一定要进行向上转型!!
否则在转型时会出现ClassCastException(类型转换异常–运行时异常)
问题: 如果向下转型存在安全隐患,那么如何转型才靠谱?
   先判断在转型(依靠instanceof关键字实现)引用名 instanceof 类 表示该引用是否能表示该类实例,返回boolean类型。

class Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是人");
    }
    public void p()
    {
    
    
        System.out.println("伤心的一天");
    }
}
class Student extends Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是学生");
    }
    public void fun()
    {
    
    
        System.out.println("开心的一天!");
    }
}
public class Test{
    
    
    public static void main(String[] args)
    {
    
    
        Person per = new Student();
        //per是否能表示Person实例
        System.out.println(per instanceof Person);
        //per是否能表示Student实例
        System.out.println(per instanceof Student);
        if(per instanceof Student)
        {
    
    
            Student stu = (Student)per;
            stu.fun();
        }
    }
}

在这里插入图片描述

1.2.3 一个向上转型的实例

  范例:定义一个方法,这个方法可以接受Person的所有实例,并调用Person类的方法

class Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是人");
    }
}
class Student extends Person{
    
    
    public void print()
    {
    
    
        System.out.println("我是学生");
    }
}
class Worker extends Person{
    
    
     public void print()
    {
    
    
        System.out.println("我是工人");
    }
}
public class Test{
    
    
    public static void main(String[] args)
    {
    
    
        whoAreYou(new Student());
        whoAreYou(new Worker());
    }
    public static void whoAreYou(Person per)
    {
    
    
        per.print();
    }
}

在这里插入图片描述

1.3 多态性的总结

  • 对象多态性的核心在于方法的覆写
  • 通过对象的向上转型可以实现接受参数的统一,向下转型可以实现子类扩充的调用(一般不操作向下转型,有安全隐患)
  • 两个没有关系的类对象是不能够转型的,一定会产生ClassCastException

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/83750898