欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

15-多态

程序员文章站 2022-07-12 16:56:17
...

多态(Polymorphism)

说在前边:

引用变量有两个类型:一个是编译时类型,一个是运行时类型
1、编译时类型:编译时类型由声明该变量时使用的类型决定。
2、运行时类型:运行时类型由实际赋给该变量的对象决定。

多态的出现:

多态的出现:
  如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
重要一段话:
  当把一个子类变量直接赋值给父类引用变量时,例如Fu04 ployName3 = new Zi04();这个ployName3引用变量的编译时类型为Fu04,而运行时类型是Zi04,当运行时调用该引用变量的方法时,其方法行为总是表现出其子类方法的行为特征,而不是父类方法的行为特征。这就可能出现:相同类型的变量调用同一方法时呈现出不同的行为特征,这就是多态

注意一点:

与方法不同的是,对象的实例变量不存在多态性。

引用变量的强制类型转换

引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它所引用的对象确实包含该方法。
   如果需要让这个引用变量调用它运行时类型的方法,则必须把它强制类型转换为运行时类型。强制类型转换需要借助于类型转换运算符。
  引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时会出现错误。
  如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类类型),否则将在运行时引发ClassCastException异常。
  
15-多态

示例代码:

package Class;

public class ConversionTest {
    public static void main(String[] args) {
        double d = 13.4;
        long l = (long)d;
        System.out.println(l);

        int in = 5;
        // 试图把一个数值类型的变量转换为boolean类型,下面代码编译出错
        // 编译时会提示:不可转换的类型
        //boolean b = (boolean) in;

        Object obj = "Hello";
        // obj 变量的编译时类型为Object,Object与String存在继承关系,可以强制类型转换
        // 而且obj变量的实际类型是String,所以运行时也可以通过
        String objStr = (String) obj;
        System.out.println(objStr);

        // 定义一个objPri变量,编译时类型为Object,实际类型为Integer
        Object objPri = new Integer(5);
        // objPri变量的编译时类型为Object,objPri的运行时类型为Integer
        // Object与Integer存在继承关系
        // 可以强制类型转换,而objPri变量的实际类型是Integer
        // 所以下面代码运行时引发ClassCastException异常
        //String str = (String)objPri;

        // 在进行强制类型转换前,先用instanceof运算符判断是否可以成功转换。
        if(objPri instanceof String){
            String str1 = (String)objPri;
        }else {
            System.out.println("不可以成功转换");
        }
    }
}

instanceof运算符

15-多态