Android-Java-静态变量与静态方法&普通变量与普通方法(内存图 完整版)
描述Student对象:
package android.java.oop12; // 描述Student对象实体
public class Student { private String name; private int age; protected static String country = "CN"; private Student() {} public Student(String name, int age) {
/**
* 通过拿到对象引用的地址(9998#==this),去操作 堆区内存的 name属性 age属性
*/
this.name = name;
this.age = age;
} public void showValue() {
/**
* 通过拿到对象引用的地址(9998#==this),去操作 堆区内存的 name属性 age属性
*/
System.out.println("name:" + this.name + " age:" + age);
} public static void printlnCountry() {
/**
* 通过类名就可用拿到 ---> 方法区(共享数据区) --> 中的 静态区 里面的 --> 静态数据 ,都是共享的
*/
System.out.println("country:" + Student.country);
System.out.println("country:" + country);
} }
main测试方法:
package android.java.oop12; public class TestDemo { public static void main(String[] args) { /**
* 实例化Student对象 new Student("张三", 89);
* 拿到实例化对象引用的地址 Student student == 9998#
*/
Student student = new Student("张三", 89); /**
* 通过拿到对象引用的地址(9998#==this),去调用showValue()方法
*/
student.showValue(); /**
* 直接调用 静态区 共享的 printlnCountry() 方法
*/
Student.printlnCountry();
} }
执行结果:
以上案例对应的内存图:
1. 执行 java TestDemo
是给JVM发送指令,和JVM说:把这个 TestDemo.class 去执行;
2.JVM就去执行 TestDemo.class 文件里面的字节码,首先第一步 是把 TestDemo.class字节码加载进内存;
3.第二步,会把TestDemo 静态数据 分配到 静态区里面去;
4.第三步,main方法进栈,是直接把静态区里面的 TestDemo --> main 方法拿过来进栈运行;
5.第四步,new Student("张三", 89);
6.第五步,注意:非常重要的点 要记住 ,那就是在 new Student("张三", 89); 的时候才把,Student.class加载进内存中的---> 存放区;
7.第六步,分配Student静态数据到--->静态区;
8.第七步,在堆内存中开辟 Student对象空间,并分配对象地址,并给变量赋初始值 null 0 等;
9.第八步:构造方法Student(name, age) 进栈, 第九步:构造方法Student(name, age)弹栈;
10.第十步,在堆内存中,name age 属性 被赋值完毕;
11.第十一步,new Student(name, age); 后 得到一个对象引用地址 给student变量;
12.第十二步,调用 student.showValue();
13.第十三步:showValue()方法进栈, 并通过this去操作name、age属性, 第十四步:showValue()方法弹栈;
14.第十五步:
;
15.第十六步:printlnCountry()方法进栈,并直接去访问 共享的 country 变量, 第十七步:printlnCountry()方法弹栈;
16.第十八步:main方法执行完毕,弹栈;
17.第十九步:等待 JVM GC 机制来回收 Student对象;
Android-Java-静态变量与静态方法&普通变量与普通方法(内存图 完整版)的更多相关文章
- Android-普通变量与普通方法内存图
描述Worker对象: package android.java.oop11; // 描述Worker public class Worker { public String name; public ...
- Android kotlin静态属性、静态方法
只需要用 companion object 包裹相应代码块即可.以静态属性为例: class Constants { companion object { val BASE_URL = "h ...
- 转载:JAVA的静态变量、静态方法、静态类
静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象 ...
- 【转】JAVA的静态变量、静态方法、静态类
转自:http://blog.csdn.net/zhandoushi1982/article/details/8453522/ 静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. ( ...
- JAVA的静态变量、静态方法、静态类
静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例
内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...
- java静态变量、静态方法和静态代码段
先上实例 public class TestStatic { public static String staticString = "this is a static String&quo ...
- java中静态的代码块,静态变量,静态方法
简单了解一下java虚拟机--jvm几个内存区域: 方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息.常量.静态变量以及方法代码的内存区域, 常量池:常量池是方法区的一部分,主要用来存放 ...
随机推荐
- 日志模块logging
import logging # 设置日志基础样式 logging.basicConfig(level=logging.INFO, format='levelname:%(levelname)s fi ...
- IntelliJ IDEA 导入多个maven项目
IntelliJ IDEA的功能十分强大 我们日常开发项目会分多个maven项目 idea单个打开切换很是麻烦 下边是idea可以同时导入多个项目的方法 1.选择 FIle -> NEW -& ...
- xcode 自动签名原理
签名的核心就是provision profile要与当前的bundle id及本地的私钥相匹配. teamid:每个开发者账号都会对应一个teamid.企业的开发这账号除了对应一个teamid外,下面 ...
- faster rcnn源码阅读笔记2
- svg矢量图
svg简介 Scalable Vector Graphics 可缩放矢量图形 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 svg知识点 svg如何绘图 svg和cnavas区别 svg ...
- netty 为什么用nio 不用 aio
NIO模型 同步非阻塞 NIO有同步阻塞和同步非阻塞两种模式,一般讲的是同步非阻塞,服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才 ...
- 2018年秋季学期面向对象程序设计(JAVA)课程总结
2018年秋季学期面向对象程序设计(JAVA)课程总结 时值2018年年末,按惯例对本学期教学工作小结如下: 1. 教学资源与教学辅助平台 教材:凯 S.霍斯特曼 (Cay S. Horstmann) ...
- DJango 基础 (2)
urls.py路由用法 知识点 url基本概念 url格式 urls.py的作用 url解析过程 include的作用 kwarg的作用 name的作用 URL概念 URL(Uniform Resou ...
- python狂犬病大数据分析
一.被动物咬伤.抓伤者,年龄以45-59岁年龄组为最多(占30.66%). 45-59岁年龄段的人与动物接触较多.被侵害的机会最多.其次受伤机会较多的是15-44岁年龄阶段的人,而7岁及以下儿童受伤比 ...
- git tag的用法
我们常常在代码封板时,使用git 创建一个tag ,这样一个不可修改的历史代码版本就像被我们封存起来一样,不论是运维发布拉取,或者以后的代码版本管理,都是十分方便的 git的tag功能 git 下打标 ...