java中的上下转型

来源:互联网 发布:盘丝洞 怎么玩 知乎 编辑:程序博客网 时间:2024/05/17 02:47

     java中经常会用到向上转型和向下转型的问题,这两种转型究竟有何区别,今天在代码层面对齐做了简单的分析,底层机制有机会再详细分析。

    下面是自己编写的测试代码,主要两个类,一个父类,一个子类:

     

public class ParentClass {public String param = "parentParam" ;public static String staticParam = "parentStaticParam" ;public static String finalParam = "parentFinalParam" ;public void method(){System.out.println("parentMethod");}public static void staticMethod(){System.out.println("parentStaticMethod");}}


 

public class ChildClass extends ParentClass{    public String param = "childParam" ;public static String staticParam = "childStaticParam" ;public final String finalParam = "childFinalParam" ;@Overridepublic void method(){System.out.println("childMethod");}public static void staticMethod(){System.out.println("childStaticMethod");}


   由以上代码看出父类和子类有同名的参数,静态参数以及方法,静态方法,下面主要通过几种方式来测试:

  

ParentClass c1 = new ParentClass() ;System.out.println(c1.param+"::"+c1.staticParam+"::"+c1.finalParam);c1.method() ;c1.staticMethod() ;System.out.println("\n父类引用,创建的是子类对象^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");ParentClass c2 = new ChildClass() ;System.out.println(c2.param+"::"+c2.staticParam+"::"+c2.finalParam);c2.method() ;c2.staticMethod() ;System.out.println("\n子类引用,创建的是子类对象^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");ChildClass c3 = new ChildClass() ;System.out.println(c3.param+"::"+c3.staticParam+"::"+c3.finalParam);c3.method() ;c3.staticMethod() ;System.out.println("\n父类引用,子类对象后将引用转型为子类^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");ChildClass c4 = (ChildClass) c2 ;System.out.println(c4.param+"::"+c4.staticParam+"::"+c4.finalParam);c4.method() ;c4.staticMethod() ;System.out.println("\n子类引用,子类对象,向上转型^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");ParentClass c5 = c3 ;System.out.println(c5.param+"::"+c5.staticParam+"::"+c5.finalParam);c5.method() ;c5.staticMethod() ;System.out.println("\n父类引用,父类对象,向下转型^^^^^^^^^^^^^^\n");ChildClass c6 = (ChildClass) c1 ;System.out.println(c6.param+"::"+c6.staticParam+"::"+c6.finalParam);c6.method() ;c6.staticMethod() ;System.out.println("\n父类引用,父类对象,向下转型^^^^^^^^^^^^^^\n");



测试结果:

 

parentParam::parentStaticParam::parentFinalParamparentMethodparentStaticMethod父类引用,创建的是子类对象^^^^^^^^^^^^^^^^^^^^^^^^^^^parentParam::parentStaticParam::parentFinalParamchildMethodparentStaticMethod子类引用,创建的是子类对象^^^^^^^^^^^^^^^^^^^^^^^^^^^childParam::childStaticParam::childFinalParamchildMethodchildStaticMethod父类引用,子类对象后将引用转型为子类^^^^^^^^^^^^^^^^^^^^^^^^^^^childParam::childStaticParam::childFinalParamchildMethodchildStaticMethod子类引用,子类对象,向上转型^^^^^^^^^^^^^^^^^^^^^^^^^^^parentParam::parentStaticParam::parentFinalParamchildMethodparentStaticMethod父类引用,父类对象,向下转型^^^^^^^^^^^^^^Exception in thread "main" java.lang.ClassCastException: testsubclass.ParentClass cannot be cast to testsubclass.ChildClassat testsubclass.ChildClass.main(ChildClass.java:57)

 

 

得出结论:

1.对象在声明时并没有被创建

2.当对象被执行new 时才会创建对象,并且实行对象的参数的引用的绑定

3.绑定分为两种形式,一种是动态绑定,一种是静态绑定

4.对于参数和静态方法实行的都是静态绑定,普通方法实行的是动态绑定

5.当子类在创建后,父类的所有参数和方法也会被创建并初始化

6.当我们去调用参数或者方法时,参数和静态方法会根据当前声明的类型去调用声明对象对应的参数,而普通方法会根据实际创建的对象类型去调用

 

0 0
原创粉丝点击