Java图文分析之继承内存布局

目录
  • 一、初步了解继承的内存布局
    • (1) 继承内存布局初探
    • (2) Object 类
    • (3) 同名的成员变量
  • 二、更复杂的继承的内存布局

一、初步了解继承的内存布局

(1) 继承内存布局初探

看下面拥有继承关系的代码,并画出内存布局图:

public class Person {
    public int age;

    public void smile() {
        System.out.println("Person_smile()_age_" + age);
    }
}

class Student extends Person {
    public double score;

    public void study() {
        System.out.println("Student_study()_score_" + score);
    }
}

class MainTest {
    public static void main(String[] args) {
        Student s = new Student();
        s.score = 95.5;
        s.age = 8;
        // Person_smile()_age_8
        s.smile();
        // Student_study()_score_95.5
        s.study();

        Person p = new Person();
        p.age = 15;
        // Person_smile()_age_15
        p.smile();
    }
}

⌨️ 通过上篇文章 Java 的访问修饰符public,protected,private(封装、继承)可以知道:Student 类通过 extends 关键字继承了 Person 类后,Student 类中便拥有了 Person 类中非 private 的成员变量和成员方法。因此,Student 对象的引用 student 可以访问到父类(Person)的 age 属性和 smile 方法

继承的内存布局图:

  • Student 类继承 Person 类后会拥有 Person 类中的 age 属性,age 属性在 Student 对象的内存中也拥有一份
  • Student 对象的内存和 Person 对象的内存各种独占,互不干扰

(2) Object 类

任何类最终都继承自 java.lang.Object 类(Object 类叫做基类

The Object class, in the java.lang package, sits at the top of the class hierarchy(层次体系) tree. Every class is a descendant(派生、后代), direct or indirect, of the Object class.

【翻译】 java.lang 包中的 Object 类位于类继承体系数的顶端。每一个类都是 Object 类的直接或间接派生类(子类)。

(3) 同名的成员变量

Java 允许子类定义和父类同名的成员变量(不推荐

public class Person {
    public int money = 10000;
}

class Teacher extends Person {
    public int money = 22222;

    public void show() {
        System.out.println("money: " + money);
        System.out.println("this.money: " + this.money);
        System.out.println("super.money: " + super.money);
    }
}

class Main {
    public static void main(String[] args) {
        Teacher t = new Teacher();
        t.show();

        /*
            output:
                money: 22222
                this.money: 22222
                super.money: 10000
         */
    }
}

上面代码的内存布局:

二、更复杂的继承的内存布局

看下面的代码,话它的内存布局图:

public class Test {
    public static void main(String[] args) {
        Son son = new Son();
    }
}

class Grandfather {
    String name = "Grandfather_name";
    String hobby = "Grandfather_hobby";
}

class Father extends Grandfather {
    String name = "Father_name";
    int money = 66666;
}

class Son extends Father {
    String name = "Son_name";
}

  • 加载类信息: 会先加载当前类的父类的类信息(包括 Object 基类)
  • Son 对象中会拥有其所有父类的属性: 父类属性和子类属性名字一样是可以的
  • ③ 访问属性的时候:先看当前类中是否有该属性?若有,直接访问;

若没有,查看直接父类是否有该属性,并且该属性是否可访问?若有并且属性没有被 private 修饰,可访问直接父类的属性;

若有但属性被 private 修饰,直接报错

若没有,继续查找父类的父类是否有该属性,并且是否可访问 …【① 看自己有没有,有就直接用;若自己没有,就看父亲有没有,若父亲没有,就看爷爷有没有,… 一直向上找,直达找到 Object;② 若中途发现有一关系有该属性,但是不能被访问(被 private 修饰),直接报错,不继续往下找了】

  • 1.父类的属性被 private 修饰,无法访问,但可通过其他方式访问(如:父类提供被 public 修饰的 get 方法)
  • 2.私有的属性在内存中依然存在,只是无法被访问而已

到此这篇关于Java图文分析之继承内存布局的文章就介绍到这了,更多相关Java继承内存布局内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Java继承中的转型及其内存分配

    看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; //① public String name = "Parent"; String getName(){ return name; } } class Student extends People { //定义一个私有的tag实例变量来隐藏父类的tag实例变量 String tag =

  • 浅析JAVA中的内存结构、重载、this与继承

    一.对象在JVM的内存结构 JAVA内存管理由JVM来管理. 1)堆,所有new出来的对象(包括成员变量) 2)栈,所有局部变量(包括方法的参数) 3)方法区,class字节码文件(包括方法,静态数据) 1.引用变量指向null时,会发生空指针异常 public class student { int age; String name; public student(int age,String name){ this.age=age; this.name=name; } public stat

  • Java中的继承详情

    目录 一. 继承 1.1 继承的实现 1.2 继承的好处和弊端 二. 继承中的成员访问特点 2.1 继承中变量的访问特点 2.2 super 2.3 继承中构造方法的访问特点 2.4 继承中成员方法的访问特点 2.5 super内存图 2.6 方法重写 2.7 方法重写的注意事项 2.8. Java中继承的注意事项 三. 继承练习 总结 一. 继承 众所周知,我们Java语言是一种面向对象的编程语言,每当我们提到Java的特性,大家一定会在脑海里浮现出Java中的​继承.多态以及封装​. 我们在

  • Java 继承与多态超详细梳理

    目录 一.继承 1.继承的概念 2.继承的语法 3.父类成员访问 (1)子类中访问父类的成员变量 (2)子类中访问父类的成员方法 4.super关键字 5.子类构造方法 6.super和this 7.代码块执行顺序 8.继承方式 9.final关键字 10.继承和组合 二.多态 1.向上转型 2.重写 3.多态 一.继承 1.继承的概念 继承机制:是面向对象程序设计是代码可以复用的最重要手段,允许程序员在保持原有类特性的基础上进行扩展,增加新的功能,产生的新类,成为派生类/子类.继承主要解决的问

  • java继承学习之super的用法解析

    继承supersuper关键字的用法和this关键字的用法相似this:代表本类对象的引用super:代表父类存储空间的标识(可以理解为父类对象引用) package com.ithema_20; /*   测试类   继承   super   super关键字的用法和this关键字的用法相似   this:代表本类对象的引用   super:代表父类存储空间的标识(可以理解为父类对象引用)  */ public class Demo {     public static void main(

  • 一篇文章超详细的介绍Java继承

    目录 前言 继承 继承的优点 重写和隐藏父类方法 重写父类中的方法 隐藏父类中的方法 方法重写和隐藏后的修饰符 子类访问父类私有成员 使用super关键字 使用super调用父类的无参数构造方法/有参数构造方法 附:继承的使用和认识 总结 前言 继承是面向对象语法的三大特征之一.继承可以降低代码编写的冗余度,提高编程的效率.通过继承,子类获得了父类的成员变量和方法.一个子类如何继承父类的字段和方法,如何修改从父类继承过来的子类的方法呢.今天我们开始学习有关Java继承的知识. 继承 继承就是子类

  • Java由浅入深带你精通继承super

    目录 什么是继承 背景 super关键字 protected 关键字 final 关键字 什么是继承 面向对象的特征: 封装:不必要公开的数据成员和方法,使用private关键字进行修饰.意义:安全性. 背景 代码中创建的类, 主要是为了抽象现实中的一些事物(包含属性和方法). 有的时候客观事物之间就存在一些关联关系, 那么在表示成类和对象的时候也会存在一定的关联 例如, 设计一个类表示动物 注意,:我们可以给每个类创建一个单独的 java 文件. 类名必须和 .java 文件名匹配(大小写敏感

  • Java图文分析之继承内存布局

    目录 一.初步了解继承的内存布局 (1) 继承内存布局初探 (2) Object 类 (3) 同名的成员变量 二.更复杂的继承的内存布局 一.初步了解继承的内存布局 (1) 继承内存布局初探 看下面拥有继承关系的代码,并画出内存布局图: public class Person { public int age; public void smile() { System.out.println("Person_smile()_age_" + age); } } class Student

  • 深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流程如下: 1. 类加载检查 JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执

  • c++对象内存布局示例详解

    目录 前言 继承对象的内存布局 具有多重继承和虚拟功能的对象的内存布局 总结 前言 了解你所使用的编程语言究竟是如何实现的,对于C++程序员可能特别有意义.首先,它可以去除我们对于所使用语言的神秘感,使我们不至于对于编译器干的活感到完全不可思议:尤其重要的是,它使我们在Debug和使用语言高级特性的时候,有更多的把握.当需要提高代码效率的时候,这些知识也能够很好地帮助我们. 简单非多态的内存布局 class X { int x; float xx; public: X() {} ~X() {}

  • 关于C++对象继承中的内存布局示例详解

    前言 本文给大家介绍的是关于C++对象继承的内存布局的相关内容,分享出来供大家参考学习,在开始之前说明下,关于单继承和多继承的简单概念可参考此文章 以下编译环境均为:WIN32+VS2015 虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,保证其容真实反应实际的函数. 首先先通过一个例子来引入虚函数表,假如现在有三

  • 详解Java对象的内存布局

    前言 今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等.要深入理解这些知识的原理,了解对象头的概念很有必要,而且可以为后面分享 synchronized 原理和 JVM 知识的时候做准备. 对象内存构成 Java 中通过 new 关键字创建一个类的实例对象,对象存于内存的堆中并给其分配一个内存地址,那么是否想过如下这些问题: 这个实例对象是以怎样的形态存在内存中的? 一个O

  • 详解Java对象创建的过程及内存布局

    一.对象的内存布局 对象头 对象头主要保存对象自身的运行时数据和用于指定该对象属于哪个类的类型指针. 实例数据 保存对象的有效数据,例如对象的字段信息,其中包括从父类继承下来的. 对齐填充 对齐填充不是必须存在的,没有特别的含义,只起到一个占位符的作用. 二.对象的创建过程 实例化一个类的对象的过程是一个典型的递归过程. 在准备实例化一个类的对象前,首先准备实例化该类的父类,如果该类的父类还有父类,那么准备实例化该类的父类的父类,依次递归直到递归到Object类. 此时,首先实例化Object类

  • Java对象的内存布局全流程

    目录 对象内存布局 对象占用内存空间 证明对象内存布局 开始先抛出一个问题:一个对象o,Object o = new Object();创建完成后会占用多少字节的内存? 要能回答这个问题,就需要了解java对象的内存布局. 对象内存布局 一个Java对象在内存中包括对象头.实例数据和对齐填充三个部分.如下图所示: 对象头 Mark Word:包含一系列的标记位比如hashcode.GC分代年龄.偏向锁位,锁标志位等.这个Mark Word在对象被加了不同量级的锁时所包含的内容和布局都有所不同,这

  • Java 对象在 JVM 中的内存布局超详细解说

    目录 一.new 对象的几种说法 二.Java 对象在内存中的存在形式 1. 栈帧(Frame) 2. 对象在内存中的存在形式 ① 3. 对象中的方法存储在那儿? 4. Java 对象在内存中的存在形式 ② 三.类中属性详细说明 四.细小知识点 1. 如何创建对象 2. 如何访问属性 五.Exercise 六.总结 一.new 对象的几种说法 初学 Java 面向对象的时候,实例化对象的说法有很多种,我老是被这些说法给弄晕. public class Test { public static v

  • Java 分析并解决内存泄漏的实例

    这几天,一直在为Java的"内存泄露"问题纠结.Java应用程序占用的内存在不断的.有规律的上涨,最终超过了监控阈值.福尔摩 斯不得不出手了! 分析内存泄露的一般步骤 如果发现Java应用程序占用的内存出现了泄露的迹象,那么我们一般采用下面的步骤分析: 把Java应用程序使用的heap dump下来 使用Java heap分析工具,找出内存占用超出预期(一般是因为数量太多)的嫌疑对象 必要时,需要分析嫌疑对象和其他对象的引用关系. 查看程序的源代码,找出嫌疑对象数量过多的原因. dum

  • java各种类型对象占用内存情况分析

    前言 其实一般的程序猿根本不用了解这么深,只有当你到了一定层次,需要了解jvm内部运行机制,或者高并发多线程下,你写的代码对内存有影响,你想做性能优化.等等等等,一句话,当你想深入了解java对象在内存中,如何存储,或者每个对象占用多大空间时,你会感谢这篇文章 本文主要分析jvm中的情况,实验环境为64位window10系统.JDK1.8,使用JProfiler进行结论验证 很多描述以及 概念是基于你懂基本java知识的,如果你看起来有点吃力,要加油咯 本片更偏重验证,更多理论,请参考:http

随机推荐