java执行程序的内存分析系列专栏二之static变量和方法内存分析
昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析。
1.static变量和方法的第一个特性内存分析
statiic变量和方法的第一个特性能通过类名.static变量和类名.static方法的形式调用,而普通只能对象的形式调用。但具体为什么是这样的,这得分析static变量和方法他们在内存中怎样分配的,因此在这里我首先建立一个学生类,里面有一个普通成员变量和一个静态成员变量以及一个普通方法和一个成员方法,然后建立了一个测试学生的类。
public class Student {
String name;//普通成员变量
static String ss;//静态成员变量
static void ss(){
System.out.println("我是一个静态方法,能被类名直接调用");
}
void speak(){
System.out.println("我是普通方法,只能通过对象调用");
}
}
public class StudentTest { public static void main(String[] args) {
// TODO Auto-generated method stub
Student.ss="sdf";
Student.ss();
//Student.name普通成员变量不能通过类名直接访问
//Student.speak()普通成员方法不能通过类名调用
Student s = new Student();
s.ss="sdf";
s.ss();
s.speak();
s.name="lisong"; } }
在这里首先加载StudentTest类到方法区,然后在堆栈为变量分配空间,具体的执行过程中内存分配已经在上一篇http://www.cnblogs.com/songadai/p/7098649.html已经分析了,所以这里就不详解了,下面就直接附上内存图。应该对static有个清晰认识了。
仔细观察上图,这里我就简要说明下,为什么static变量和方法能够通过类名直接访问,而普通成员变量却不能直接访问,静态区是一块特殊的区域,特殊在能访问能通过类名直接找静态变量和方法这块区域,而代码区和常量区却不能直接访问。
2.static变量和方法的第二个特性内存分析
static变量和方法的第二个特性是静态方法不能直接调用普通成员变量方法和普通成员变量,但普通变量却能直接调用静态方法和变量以及对象也能调用静态成员和方法。其实当对象访问变量时的过程时这样的,当对象一个访问一个变量时,首先先在对象自己所在的堆空间寻找,如果没有找到,则去静态区寻找变量,如果没有找到,就报错。
这里有点注意的是,根据类创建对象的时候,静态变量不会创建,它只属于类。
3.结语
内存分析系列第二篇就差不多结束了,下一篇我们将讨论下关于this,super的一些内部机制。
java执行程序的内存分析系列专栏二之static变量和方法内存分析的更多相关文章
- Java之面向对象概述,类,构造方法,static,主方法,对象
一.面向对象概述 面向过程 "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想.这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响 ...
- 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性
原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...
- Java中子类是否可以继承父类的static变量和方法而呈现多态特性
静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制: 它们仅能调用其他的static 方法. 它 ...
- java中static变量和方法的总结
转自:http://blog.csdn.net/haobo920/article/details/5921621 java中static变量和方法的总结 java中一切皆是对象 一个类中对象的定义一般 ...
- java static 变量,和方法从属于类
第36集 java static 变量,和方法从属于类 可以用类来直接调用static属性和方法 static方法不能调用非静态的属性和方法,反之可以 new产生的对象,不包括static 属性和方法
- java执行程序的内存分析系列专栏
近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点.写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解 ...
- Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析
原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...
- Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析
原文地址:http://www.javatang.com 症状及解决方案 下面列出几种常见的症状即对应的解决方案: CPU占用率很高,响应很慢 按照<Java内存泄漏分析系列之一:使用jstac ...
- jvm系列(二)jvm垃圾收集器与内存分配策略
众所周知,在java语言中,内存分配和回收是由jvm自动管理的.因此内存的分配和回收也是jvm三大功能之一.垃圾收集器(GC)需要完成三件事情: 哪些内存需要回收? 什么时候进行回收? 如何回收? 本 ...
随机推荐
- 回锅的美食:JSP+EL+JSTL大杂烩汤
title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...
- Microsoft Windows 2003 SP2 - 'ERRATICGOPHER' SMB Remote Code Execution
EDB-ID: 41929 Author: vportal Published: 2017-04-25 CVE: N/A Type: Remote Platform: Windows Aliases: ...
- sbt结合IDEA对Spark进行断点调试开发
笔者出于工作及学习的目的,经常与Spark源码打交道,也难免对Spark源码做修改及测试.本人一向讲究借助工具提升效率,开发Spark过程中也在摸索如何更加顺畅的对源码进行调试. Spark基于Sca ...
- Android N多窗口支持
Android N 可以同时显示多个应用窗口. 在手机上,两个应用可以在"分屏"模式中左右并排或上下并排显示.例如,用户可以 在上面窗口聊QQ,下面窗口发送短信. 如图所示,两个a ...
- CI 图片上传路径问题的解决
很久没有用CI了,新公司需要用ci ,图片上传的功能,我都搞半天,伤心 1. 要看源码,upload.php里do_upload()是上传的主要函数. public function do_uploa ...
- AlertDialog中的EditText不能输入
一.描述 在项目中有碰到使用AlertDialog,给他设置自定义布局,自定义布局中有包含EditText,但是运行起来后发现EditText不能输入文字,没有焦点,一开始还以为是事件拦截掉了,后来试 ...
- 如何使用Handler
什么是Handler? Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联.每个Handler的实例都关联了一个线程和线程的消息队列.当创建 ...
- HDU1829(种类并查集)
ps:本来是想找个二分图判断的题来写,结果百度到这鬼题 Problem Description Background Professor Hopper is researching the sexua ...
- webpack使用
Webpack是一个现代js应用的模块打包机.如果一个文件依赖另一个文件,webpack认为这就存在一个依赖关系.不管另一个文件是什么内容,image,css或js都被当作一个模块.Webpack从e ...
- 《Android进阶》之第三篇 深入理解android的消息处理机制
Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 android的消息处理机制(图+源码分析)——Looper,Handler,Message an ...