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

简介: 还记得刚通过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类型的实例,如下图:


70.png


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


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


相关文章
|
1月前
|
监控 Java
Java中的内存泄漏分析与排查技巧
Java中的内存泄漏分析与排查技巧
|
2月前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
29 0
|
22天前
|
Java
jmap 查看jvm内存大小并进行dump文件内存分析
jmap 查看jvm内存大小并进行dump文件内存分析
27 3
|
24天前
|
监控 算法 Java
|
25天前
|
Arthas 监控 Java
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
|
4天前
|
搜索推荐 Java API
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
5 0
|
7天前
|
监控 Java
JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)
JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)
14 0
|
1月前
|
监控 算法 Java
压测分析Java内存和CPU暂用
7月更文挑战第7天
26 5
|
1月前
|
监控 Java 开发者
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
74 2