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" ;
@Override
public 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::parentFinalParam
parentMethod
parentStaticMethod
父类引用,创建的是子类对象^^^^^^^^^^^^^^^^^^^^^^^^^^^
parentParam::parentStaticParam::parentFinalParam
childMethod
parentStaticMethod
子类引用,创建的是子类对象^^^^^^^^^^^^^^^^^^^^^^^^^^^
childParam::childStaticParam::childFinalParam
childMethod
childStaticMethod
父类引用,子类对象后将引用转型为子类^^^^^^^^^^^^^^^^^^^^^^^^^^^
childParam::childStaticParam::childFinalParam
childMethod
childStaticMethod
子类引用,子类对象,向上转型^^^^^^^^^^^^^^^^^^^^^^^^^^^
parentParam::parentStaticParam::parentFinalParam
childMethod
parentStaticMethod
父类引用,父类对象,向下转型^^^^^^^^^^^^^^
Exception in thread "main" java.lang.ClassCastException: testsubclass.ParentClass cannot be cast to testsubclass.ChildClass
at testsubclass.ChildClass.main(ChildClass.java:57)
得出结论:
1.对象在声明时并没有被创建
2.当对象被执行new 时才会创建对象,并且实行对象的参数的引用的绑定
3.绑定分为两种形式,一种是动态绑定,一种是静态绑定
4.对于参数和静态方法实行的都是静态绑定,普通方法实行的是动态绑定
5.当子类在创建后,父类的所有参数和方法也会被创建并初始化
6.当我们去调用参数或者方法时,参数和静态方法会根据当前声明的类型去调用声明对象对应的参数,而普通方法会根据实际创建的对象类型去调用