编译时类型和运行时类型,java运行时和编译时
00-1010 1.定义2。举例说明3。注意事项
00-1010多态性是指同一类型的变量在调用同一方法时表现出不同的行为特征。
00-1010在SubClass.java文件中存在两个类:是父类BaseClass,另一个是子类(继承自BaseClass类)。
class base class { public int book=6;public void base(){ system . out . println(父类的公共方法);} public void test(){ system . out . println(父类的重写方法);}} public class子类扩展基类{public string book=轻量级Java EE企业应用实践;public void test(){ system . out . println(覆盖父类的子类的方法);} public void sub(){ system . out . println(子类的常用方法);} public static void main(string[]args){//将子类对象直接赋给父类引用变量PLYOPHICBC基类PLYOPHICBC=new subclass();system . out . println(polymophicbc . book);polymophicbc . base();polymophicbc . test();//polymophicbc . sub();}}}父类BaseClass子类Subclass book : int book 3360 string void base()void test()void test()void sub()在子类的main()方法中,base class Employment phi CBC=New Subclass();这行代码直接将一个子类对象赋给一个父类引用变量,没有任何类型转换(或向上转换),这是由系统自动完成的。baseclass polymophicbc=new subclass();这一行中的引用变量ploymophicBc的编译时类型为BaseClass,运行时类型为SubClass。当运行库调用引用该变量的方法时,其方法行为总是显示子类方法的行为特征,而不是父方法的行为特征。编译时类型的PLYOPHICBC和运行时类型的PLYOPHICBC baseclasssystem . out . println(PLYOPHICBC . book);这行代码访问父类对象的实例变量,即输出“6”。对象的实例变量没有多态性,所以程序中输出父类BaseClass类的实例变量的值6。ploymophicbc.base();在这行代码中,引用变量ploymophicBc调用base()方法,会执行从父类继承的base()方法,即输出的是“父类的公共方法”。ploymophicbc.test();在这行代码中,当引用变量ploymophicBc调用test()方法(该方法在父类BaseClass中定义,但父类的方法在子类中覆盖)时,实际执行的是当前类的test()方法,即子类中覆盖的test()方法,即输出的是“子类覆盖父类的方法”。ploymophicbc.sub();这行代码会在编译时引发错误:无法解析“基类”中得方法“sub”.虽然引用变量ploymophicBc实际上包含了sub()方法,但是它不能在编译时调用sub()方法,因为它的编译时类型是BaseClass。
00-1010引用变量在编译时只能调用其编译时类型的方法,但运行时执行其运行时类型的方法。个人理解:用polymophicbc . test();例如,在这行代码中,引用变量ploymophicBc在编译时只能调用其编译时类型(即父类BaseClass类)拥有的方法(即BaseClass类的test()方法),但在运行时实际执行运行时类型(即子类类)拥有的方法(即子类类的test()方法)。编写Java代码时,引用变量只能调用用于声明该变量的类中包含的方法。比如通过Object p=new Person();这行代码定义了一个变量P,所以这个变量P只能调用Object类的方法,而不能调用Person类中定义的方法。当引用变量用于访问其包含的实例变量时,系统总是试图访问由其编译时类型定义的成员变量,而不是由其运行时类型定义的成员变量。polymophicbc . base();polymophicbc . test();这两行代码可以运行,而ploymophicBc.sub();这行代码不能运行的根本原因就在于:调用引用变量ploymophicBc的base()方法时,因为在编译时是BaseClass的类型,BaseClass包含base()方法,所以可以编译。运行时,由于子类中没有base()方法,引用变量在调用base()方法时,只能调用从父BaseClass类继承的base()方法。当引用变量ploymophicBc调用test()方法时,这一行代码可以被编译,因为它的类型在编译时是BaseClass,而BaseClass包含了test()方法。个人理解是编译器由编译时类型编译,然后按照“运行时执行其运行时类型的方法”的原则最终执行子类类的test()方法,因为其运行时类型是子类。引用变量ploymophicBc调用sub()方法时,由于其类型在编译时是BaseClass,但BaseClass类没有sub()方法,所以甚至无法通过编译,会报错。这就是本文关于Java编译时类型和运行时类型的内容。有关Java编译时类型和运行时类型的更多信息,请搜索以前关于流行IT的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。