java 继承内存分配
今天,复习的是继承的内存分配。我们知道,Java中内存可以初略分为堆、栈、方法区。
- package sort;
- class Person{
- public int age;
- public String name;
- public Person(){
- System.out.println("父类");
- say();
- }
- public void say(){
- System.out.println("有人说话。");
- }
- }
- class Student extends Person{
- public String school;
- public Student(){
- System.out.println("子类");
- }
- public void say(){
- System.out.println("学生"+name+age);
- }
- }
- public class ExtendsDemo
- {
- public static void main(String[] args) {
- Student s = new Student();
- s.age=20;
- s.name="tom";
- s.say();
- }
- }
上面是一个简单的继承例子,输出的结果是:
父类
学生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变量,也会被继承并且初始化在子类父对象中,只不过对外不可见。
当出现多态情况的时候,调的具体是哪个函数又需要匹配了。
java 继承内存分配的更多相关文章
- java继承内存分配
java继承内存分配 继承的基本概念: * Java不支持多继承,也就是说子类至多只能有一个父类. * 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. * 子类中定义的成员 ...
- 图解Java继承内存分配
图解Java继承内存分配 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子 ...
- 【java基础】(3)Java继承内存分配
继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子类中定义的成员变量和父类中定义 ...
- (转载)图解Java多态内存分配以及多态中成员方法的特点
图解Java多态内存分配以及多态中成员方法的特点 图解Java多态内存分配以及多态中成员方法的特点 Person worker = new Worker(); 子类实例对象地址赋值给父类类型引 ...
- JAVA中内存分配的问题
JAVA中内存分配的问题 1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出 ...
- java中内存分配策略及堆和栈的比较
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- Java 对象内存分配与回收
JVM内存区域模型: * 程序计数器,内存区域极小,是当前线程的字节码执行行号指示器: * 虚拟机栈.本地方法栈,即平时所说的“栈”,是虚拟机用来执行方法(包括Java.非Java方法)时,使用的临时 ...
- JAVA虚拟机内存分配与回收机制
Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现.Java虚拟机有自己想象中的硬件,如处理器.堆栈.寄存器等 ...
- Java的内存分配
java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...
随机推荐
- UCloud数据盘扩容步骤
1. 扩容目的 由于服务器数据盘存储空间不足导致系统无法正常的.为了彻底解决此问题,我们需要对服务器数据盘进行扩容. 2. 扩容步骤 2.1. 关机(如下图) 2.2. 创建快照(如下图) 2 ...
- 兄弟连学python---Socket介绍
UDP协议 UDP:用户数据报协议,不可靠性,只是把应用程序传给IP层数据报送出去,但是不能保证他们是否能到达目的地,传输数据报钱不用再客户端和服务器之间建立连接,并且没有超时重发机制,所以传输速度快 ...
- Where are your from!!!!!!!!!!!! !Baby! {封装}
在说Java 三个特性之前,我们先了解一下什么是面向对象,以及为什么Java是面向对象的语言. 面向对象是区别于面向过程的一种编程的思想.我们可以通过这个例子冰箱装大象的例子来了解一下面向对象与面向过 ...
- Spring EnableWebMvc vs WebMvcConfigurationSupport
EnableWebMvc vs WebMvcConfigurationSupport spring doc解释 WebMvcConfigurationSupport: This is the main ...
- meven仓库设置局域网私服
找到设置文件 在设置文件中配置私服地址
- Python基础:七、注释
有时候我们写的东西不一定都是给用户看的,或者不希望解释器执行(方便自己,方便他人),我们可以使用#来注释掉代码被注释的内容是不会执行的,可以方便后面的程序员来拜读你的代码. 1. 单行注释:#被注释的 ...
- Assembly Experiment5
Answer to the experiment(1),(2),(3),(4) Experiment(5): Screenshots&Results: from the command u w ...
- golang-http-post
func httpPost() { resp, err := http.Post("https://www.abcd123.top/api/v1/login", "app ...
- mysql 生成时间序列数据 - 存储过程
由于时间自动转换为int值, 做一步转化,也可在调用时处理 use `test`; CREATE table test.test1 as SELECT state, id, `规格条码`, `色号条码 ...
- CSS奇淫技巧
对于图标,使用fontsize设置大小,而非宽高! 高度不够的时候使用min-height 保持宽高比 四个方向的padding都是相对于 本盒子的宽度来的 常用于视频和图片的展示,比如轮播图. 所以 ...