前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【J2SE快速进阶】——向上转型及其内存分析

【J2SE快速进阶】——向上转型及其内存分析

作者头像
DannyHoo
发布2018-09-13 11:37:53
3300
发布2018-09-13 11:37:53
举报
文章被收录于专栏:Danny的专栏Danny的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1336945

       还记得刚通过C#学习面向对象时,接触了对象转型,最近学习Java,又遇到了。这里再用Java分析一下对象的转型,并适当利用内存分析来加深理解。

向上转型

       我们都知道,狗是动物中的一种,那么如果现在有一个Dog类和Animal类,那么他们的关系就是Dog类继承Animal类。

       我们经常说,狗是动物,实际上“狗是动物”这句话就是向上转型的一个例子,即把狗(子类)当做动物(父类)来看待。用一句话来总结,向上转型就是父类的引用指向子类的实例

实例说明&&内存分析

      下面就用一个简单的小例子加上内存分析来理解向上转型。

       定义父类Animal和子类Dog

代码语言:javascript
复制
 class Animal{
	public String name;
	Animal(String name){
		this.name=name;
	}
	public void SetName(String name){
		this.name=name;
	}
}

 class Cat extends Animal{ 
	public String furcolor;
	Cat(String name,String furcolor){
        super(name);
		this.furcolor=furcolor;
	}
	public void SetFurcolor(String color){
		this.furcolor=color;
	}
}

        定义UpCastingTest类

代码语言:javascript
复制
public class UpCastingTest {
	public static void main(String[] args) {		
		Animal a=new Cat("叮当猫","蓝色");		
		a.SetName("大脸猫");
		System.out.println(a.name);
		//a.SetFurcolor("黄色");
		//System.out.println(a.furcolor);				
	}
}

        在main方法中虽然定义了Animal类型的变量a,但它指向的是一个Cat类型的实例,如下图:

         在上面的内存图中,实例化Dog类时,在堆内存中的Dog类实例中会包含它的父类(即上图中黄色部分),下面的部分是只属于自己的,栈内存中的引用a虽然指向堆内存中的Dog类实例,但它毕竟是一个Animal类型的引用,所以在Dog实例中,除了继承自Animal的那一部分,其余的部分它并看不到。因此我们可以看做a实质上指向的是堆内存中属于Animal类的那一部分(即黄色的那一部分)。所以在main方法中,如果执行注释掉的那两句代码 “a.SetFurcolor("黄色");” 或者 “System.out.println(a.furcolor);” 时就会报错。

         因此,当父类的引用指向子类对象的时候,父类的引用只可以访问子类继承于父类的那一部分属性和方法以及子类重写的父类的方法

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年01月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档