“
在多态中
对于普通方法:
编译时看左边,运行时看右边。
对于静态方法:
编译、运行都看左边
对于成员变量:
编译、运行看左边
”
对于静态方法:
编译、运行都看左边
为什么对于静态方法 ,无论是编译还是运行 ,都是根据基类呢?
Person p = new Student()
Person p:引用
new Student():新实体
解答:
Java中除了static和final方法外,所有方法都是使用动态绑定的。
在多态中,upcast(向上转型)可以简化程序的设计,提高程序的扩展性。
Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,会出现所谓的多态。
多态是的发生时基于对象的。也就是说,只有在“new”出新的实体时,才有多态这一说。多态中的public、protected方法可以被导出类覆写,
我们使用这些可以覆写的方法时,如果只是声明了引用,编译器是没有办法确定到底是使用的哪个方法的,因此,我们使用动态绑定的方式,在调用方法之前,
指定我们要调用的是哪个类的方法。Person p = new Student()
然而什么是静态绑定?
静态绑定(前期绑定)是指程序在执行前进行绑定,由编译器和连接程序实现。
在程序执行前,我们指明了类的引用Person p 。
也就是说,static使用的是静态绑定,而静态绑定的过程中,我们加载了类的引用,而static是随着类的出现而出现的。而且static方法只有一份。static方法“绑定”在了类上
所以说,对于静态方法 无论是编译和运行都看左边。
/**程序在执行前的编译过程中我们进行了什么步骤呢?
词法分析、语法分析、中间代码生成、代码优化和目标代码生成*/