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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/42566043

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

向上转型

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

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

实例说明&&内存分析

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

       定义父类Animal和子类Dog

 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类

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);” 时就会报错。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

python 面向对象之类方法

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

8120
来自专栏海天一树

小朋友学Java(9):抽象类与接口

之前提过面向对象有三大特性:封装、继承、多态。 还有另一种说法,即面象对象有四大特性:抽象、封装、继承、多态。 这两种说法都是对的,不必拘泥于哪种说法。关键要能...

30890
来自专栏JavaEdge

SpringBoot2.0响应式编程系列(二)-函数式编程和lambda表达式函数接口方法引用类型推断

59930
来自专栏JetpropelledSnake

Python入门之面向对象编程(二)python类的详解

本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性、方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Ca...

32890
来自专栏mukekeheart的iOS之旅

Java 内部类种类及使用解析

  Java 内部类种类及使用解析 内部类Inner Class   将相关的类组织在一起,从而降低了命名空间的混乱。   一个内部类可以定义在另一个类里,可以...

25850
来自专栏精讲JAVA

详解 equals() 方法和 hashCode() 方法

Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和ha...

9110
来自专栏ios 技术积累

Java 重写(Override)与重载(Overload)总结

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根...

15520
来自专栏用户3030674的专栏

java上转型和下转型(对象的多态性)

/*上转型和下转型(对象的多态性) *上转型:是子类对象由父类引用,格式:parent p=new son *也就是说,想要上转型的前提必须是有继承关系的两...

44810
来自专栏函数式编程语言及工具

Scalaz(21)-类型例证:Liskov and Leibniz - type evidence

  Leskov,Leibniz,别扭的名字,是什么地干活?碰巧从scalaz源代码里发现了这么个东西:scalaz/BindSyntax.scala /** ...

19060
来自专栏精讲JAVA

详解 equals() 方法和 hashCode() 方法

Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和ha...

13130

扫码关注云+社区

领取腾讯云代金券