在上次我们说的《重载与重写》呢,我们遗留了一个问题,就是运行结果的各异性,那今天,我们就来探究一下
        内存里的天地。

        
        首先呢,我们把mian()调出来:
public static void main(String[] args){        Person person1=new Person();        //new了一个系统默认的Person的构造方法
person1.getInfo();
//************************
person1.name="米老师(1)";
person1.age=19;
person1.getInfo(); //赋值区
//************************
Person person2=new Person("米老师",18); //new是Person的重载的构造方法,内带参数name,age
person2.getInfo();
//**************************
Teacher teacher1=new Teacher();
teacher1.getInfo(); //重写父类Person类的getInfo方法
//**************************
teacher1.name="姜老师1";
teacher1.age=21;
teacher1.sex="女1";
teacher1.getInfo(); //赋值区
//**************************
Teacher teacher2=new Teacher("姜老师",20,"女");
teacher2.getInfo();
}

首先,是第一句

Person person1=new Person();

我们知道,他调用的是Person构造方法中那个没有参数的,所以执行完这一句,内存中是什么样子的呢?



这就是为什么getInfo方法中打印出来,name为null,age为0,因为name是string类型,里面没有东西,所以是null,而age是int类型,默认等于0;

那接下来的赋值语句在内存中又是如何体现的呢?

执行完这个操作后,处于栈那得的局部变量被垃圾回收机制清除,变成这样:

栈里有一个person1,指向堆里对应的内容

那第二种有参数的构造方法(方法重载)又是个什么东西呢?在内存中怎样体现,结合person1:

Person(String _name,int _age)构造方法有自己的变量_name和_age,_name和_age把值赋给Person类的成员变量name,age然后进而改变堆里面的属性值,当该方法完成后,栈里面回收垃圾,

接下来就是老师Teacher的实例化了

那对于teacher1来说,是个什么情况呢?



new完成后,堆里面有这么个东西,其实吧,name和age是由父类Person继承来的,而Teacher还有一个自己的sex属性,所以是这么个情况,变现成这样,而他的赋值操作和上面Person是一样的





清理垃圾



我想剩下那个就不用我画了吧,大家也试着画一下。

那在这,我还有一个问题,“父类的引用指向子类的对象,在这个情况下,父类的引用只可以访问子类继承于父类的那一部分属性和方法以及子类重写的父类的方法。在Teacher对应的内存图里面又该怎么体现呢?”

用代码来说就是

Person teacher1=new Teacher();

我的理解是,Person定义了对象teacher1的类型是Person类型,他是把teacher1当成一个人来看,而不是一个老师,所以他只能拥有person具有的属性,而不能访问子类teacher自己定义的方法。teacher在这里只是一个人,不是一个老师



现在大家明白了吧,接下来大家可以去查一下,如何让teacher1的sex属性上面有值呢?也就是说,输出我的性别是男或者女!其实这个问题我们已经解决了。好好看看吧



【java基础】内存分析的更多相关文章

  1. Java面向对象内存分析

    title: Java面向对象内存分析 date: 2018-07-28 11:12:50 tags: JavaSE categories: - Java - JavaSE 一.Java虚拟机的内存区 ...

  2. Java 程序内存分析

    转自:http://www.iteye.com/topic/528230 java程序内存主要分为了2个部分,包括stack segment(栈内存区).heap segment(堆内存区). 在分析 ...

  3. java基础知识分析: final , finally,finalize

    final final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方 ...

  4. Java程序内存分析:使用mat工具分析内存占用

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏

    Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...

  6. java基础内存基础详解

    堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ...

  7. JAVA基础面向对象分析

    面向对象内存的分析: 一:内存的分类 1:栈(tack) 2:堆(heop) 3: 静态区 4:代码区 二:引用数据类型内存特点 三:引用数据类型传值的特点 四:引用数据类型在作为参数时的特点 面向对 ...

  8. java虚拟机内存分析

    1.大致来说java虚拟机分为:堆  栈 栈在数据结构就是那个先进后出的栈.堆...这名字我一听就觉得大..毕竟我们形容东西多又没什么大多的组织的时候就是一堆一堆的....(原谅我发散性的思维,我是妹 ...

  9. iOS基础 - 内存分析

    一.内存的重要性 程序是否可用的最根本的制约因素. 十分影响用户体验. 程序的crash有很多情况都是内存的原因. 二.iOS平台内存警告机制 iOS系统不支持虚拟内存,一旦出现内存不足的情况,iOS ...

  10. java 堆栈内存分析详解

    计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时 ...

随机推荐

  1. 基础02 Java 跨平台原理

    1993 , JAVA初衷: 机顶盒 1994 年互联网刚刚兴起,.(高司令\ 高斯林),改造成了面向互联网的计算机语言.java重要特性之 ------- 跨平台(一次编译,到处运行).平台:操作系 ...

  2. 理解和解决MySQL乱码问题【转】

    本文来自:http://www.cnblogs.com/cenalulu/p/4325693.html 要了解为什么会出现乱码,我们就先要了解从客户端发起请求,到MySQL存储数据,再到下次从表取回客 ...

  3. 比较两个mysql数据库表结构的差异

    需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...

  4. 【QT】自己生成ui加入工程

    在三个月前 我就在纠结 C++ GUI Qt 4编程这本书中2.3节 快速设计对话框这一段. 按照书上的做没有办法生成能够成功运行的程序. 这两天又折腾了好久,终于成功了. 注意事项: 1. 我之前装 ...

  5. Javascript异步编程方法总结

    现在我们有三个函数,f1, f2, f3 按正常的思路我们会这样写代码: function f1 (){}; function f2 (){}; function f3 (){}; //在这里调用函数 ...

  6. css去掉iPhone、iPad默认按钮样式

    原文链接:http://blog.sina.com.cn/s/blog_7d796c0d0102uyd2.html 只要在样式里面加一句去掉css去掉iPhone.iPad的默认按钮样式就可以了!~ ...

  7. Swift - 获取、改变按钮的标题文本(UIButton点击切换title)

    在开发中,我们常常需要动态地改变按钮标签文字,使用 setTitle() 函数就可以了.有时我们需要在几个标题间切换,比如下面样例所示,按钮点击后按钮文字会在"播放""暂 ...

  8. string int 转换

    int转stringint n = 0;std::stringstream ss;std::string str;ss<<n;ss>>str;string转intstd::st ...

  9. 自定义log日志

        Log.cs (这个已经不能用了,用下面的问题解决方案) using System; using System.Collections.Generic; using System.Web; u ...

  10. HTML5学习之文件操作(九)

    之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很进行跨平台的处理,另外就是让我们的web应用依赖了第三方的插件,而不是很独立 ...