zoukankan      html  css  js  c++  java
  • java 继承内存分配

    今天,复习的是继承的内存分配。我们知道,Java中内存可以初略分为堆、栈、方法区。

    [java] view plain copy
     
    1. package sort;  
    2. class Person{  
    3.     public int age;  
    4.     public String name;  
    5.     public Person(){  
    6.         System.out.println("父类");  
    7.         say();  
    8.     }  
    9.     public void say(){  
    10.         System.out.println("有人说话。");  
    11.     }  
    12. }  
    13. class Student extends Person{  
    14.     public String school;  
    15.     public Student(){  
    16.         System.out.println("子类");  
    17.     }  
    18.     public void say(){  
    19.         System.out.println("学生"+name+age);  
    20.     }  
    21. }  
    22. public class ExtendsDemo  
    23. {  
    24.     public static void main(String[] args) {  
    25.         Student s = new Student();  
    26.         s.age=20;  
    27.         s.name="tom";  
    28.         s.say();  
    29.     }  
    30. }  

    上面是一个简单的继承例子,输出的结果是:

    父类
    学生null0
    子类
    学生tom20

    可以先画个内存图:

    可以简易理解成父类的空间是一个小圆,被子类的大圆包住了,所以当我们从子类找一个变量,是先从大圈圈找,找到了就返回,如果大圈圈没有,那就到小圈圈里找。

    这个程序执行的基本流程是:

    1.虚拟机加载Test类,提取类信息到方法区;

    2.通过保存在方法去的字节码,虚拟机开始执行main方法,main函数入栈;

    3.执行Student s = new Student();给student实例对象分配堆空间。又因为实现自己要先实现父类,所以,虚拟机加载person类到方法区,并在堆中为父类成员变量在子类空间中初始化。然后加载student类到方法区,为子类的成员变量分配空间并初始化。

    4.接下来两条语句为成员变量赋值,由于name跟age是从父类继承而来,会被保存在子类父对象中,所以就根据引用变量s持有的引用找到堆中的对象(子类对象),然后给name跟age赋值。

    5.调用say()方法,通过引用变量s持有的引用找到堆中的实例对象,通过实例对象持有的本类在方法区的引用,找到本类的类型信息,定位到say()方法。say()方法入栈。开始执行say()方法中的字节码。

    6.say()方法执行完毕,say方法出栈,程序回到main方法,main方法执行完毕出栈,主线程消亡,虚拟机实例消亡,程序结束。

      总结:相同的方法会被重写,变量没有重写之说,如果子类声明了跟父类一样的变量,那意味着子类将有两个相同名称的变量。一个存放在子类实例对象中,一个存放在父类子对象中。父类的private变量,也会被继承并且初始化在子类父对象中,只不过对外不可见。

    当出现多态情况的时候,调的具体是哪个函数又需要匹配了。

      

     
  • 相关阅读:
    开机提示grub可咋办啊
    Powershell学习之道-文件夹共享及磁盘映射
    linux查看python安装路径,版本号
    WP_Image_Editor_Imagick 漏洞临时解决方法
    在生产环境使用Docker部署应用
    PPTP服务器配置选项详解
    【Linux常见问题】Centos7的网络配置问题
    【大数据技术】HBase与Solr系统架构设计
    【大数据技术】操作系统和Hadoop版本选择
    【大数据技术】Sqoop
  • 原文地址:https://www.cnblogs.com/elenz/p/8038366.html
Copyright © 2011-2022 走看看