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

本文详细分析了Java中编译时类型(Birds类声明)与运行时类型(Sparrows对象)的区别,通过实例演示了如何在继承关系中理解变量的实际行为。重点讲解了对象调用的编译时类型属性和运行时类型方法的区分。
摘要由CSDN通过智能技术生成

1.编译时类型:声明该变量时使用的类型。

2.运行时类型:该变量指向的对象类型。

记住:对象调用编译时类型的属性和运行时类型的方法

class Birds {
    public String name;
    public Birds() {
        name = "birds";
    }
    public void yell() {
        System.out.println("birds yell");
    }
}
class Sparrows extends Birds {
    public String name;
    public Sparrows() {
        name = "sparrows";
    }
    public void yell() {
        System.out.println("Sparrows yell");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Birds bird = new Birds();
        System.out.println(bird.name);
        bird.show();

        System.out.println();

        Birds birdOne = new Sparrows();
        System.out.println(birdOne.name);
        birdOne.show();

        System.out.println();

        Sparrows sparrow = new Sparrows();
        System.out.println(sparrow.name);
        sparrow.show();
    }
}

 结果:

birds
birds yell

birds
Sparrows yell

sparrows
Sparrows yell

分析:我们来看这段代码:Birds bird=new Sparrows(),由上面代码可以知道Sparrows类继承自Birds类,那么,假如bird的属性修饰符为public 那么访问属性时得到的是Birds类的属性还是Sparrows类的属性?方法调用又是哪个类?答案是:会得到Birds类的属性,调用Sparrows类的方法。为什么会这样呢?这里就需要知道什么是编译时类型和运行时类型,Java程序状态会分为编译和运行这两种状态,编译时,JVM会在栈中静态创建基本数据变量,和引用数据变量的引用,回到刚刚那句代码,显然,bird这个引用就是在编译时创建的,那么,bird的编译时类型就是Birds,当运行这段java代码时,JVM在堆中为bird新建一块内存,对应new Sparrows()这段代码,所以bird的运行时类型就是Sparrows。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值