Java编译时类型和运行时类型

一、前言

最近在做笔试题的时候,才看到有这么一个知识点,查了好几篇博客,在这里记录一下

二、是什么

Java引用变量有两个类型,一个是编译时类型,还有一个是运行时类型。

编译时类型是由声明该变量时使用的类型所决定,运行时类型是由该变量指向的对象类型决定

如果两种类型不一致,就会出现多态,因此就会将子类对象之间赋值给父类引用变量,称为向上转型,而不用进行类型转换。如 Animal a = new Bird(),其中引用变量 a 的编译时类型是 Animal,运行时类型是 Bird,两者不一致,因此出现多态

当使用该对象引用进行调用的时候,有这么一条规则,对象调用编译时类型的属性和运行时类型的方法

我们直接看一个例子来验证这句话

class Person {
    public String name;

    public Person() {
        name = "person";
    }

    public void show() {
        System.out.println("person show");
    }
}

class Woman extends Person {
    public String name;

    public Woman() {
        name = "woman";
    }

    public void show() {
        System.out.println("woman show");
    }
}

public class TestDemo {

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);
        person.show();

        System.out.println();

        Person person1 = new Woman();
        System.out.println(person1.name);
        person1.show();

        System.out.println();

        Woman woman = new Woman();
        System.out.println(woman.name);
        woman.show();
    }

}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45

结果:

person
person show

person
woman show

woman
woman show

    1
    2
    3
    4
    5
    6
    7
    8

从结果可以看出,第一条语句 person 引用调用的属性属于 Person 类,person 引用调用的方法还是 Person 类;之后以此类推

三、参考

https://blog.csdn.net/snow_7/article/details/51579278
https://blog.csdn.net/qq_29513537/article/details/60765552
https://blog.csdn.net/qq_23419401/article/details/52064871#java
---------------------
作者:EclipseO2
来源:CSDN
原文:https://blog.csdn.net/babycan5/article/details/82355550
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-05-13 15:32  天涯海角路  阅读(760)  评论(0)    收藏  举报