java中的上下转型

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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值