1.static的作用

答:将成员变量或方法存储进方法区。因为方法区能保证数据只存在一份,只会加载一次(类加载器加载类的时候才加载一次)

注:static Object obj = new Object();方法区存储的是obj这个引用变量,而不是Obejct这个被创建的对象,对象依旧存储在堆中。只不过由于statcic 引用变量一直存在,导致堆中这个对象一直没法被回收。

注:一定要区分什么叫变量!什么叫对象!方法区明文说的是:存储静态变量和静态方法。是变量,即引用变量,不是对象。

java中对对象的控制室通过引用来控制的。所以控制了引用,就是控制了对象,引用就是变量!变量就是引用。可以在引用或变量加synchronized控制,以达到控制对象线程安全。

2.static修饰的变量和方法的存储区域是哪里?

答:方法区。

3.存储在方法区的数据是安全的么?

答:因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。

方法区的数据不是线程安全的,因为方法区的内容是多线程共享的,所以要对static修饰的方法进行加锁synchronized。以保证多线程访问是安全的。

4.怎样将数据存储在方法区?

答:用static关键字修饰的变量和方法都会存储在方法区里。

5.方法区中数据的生命周期是怎样的?

答:一直伴随着程序,和应用的生命周期一样。

6.方法区溢出
答;方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展java程序,一些类也会成为垃圾。jvm可以回收一个未被引用类所占的空间,以使方法区的空间最小。

所以尽量在程序中少使用static关键字。因为加载类时候,类信息也都存储在方法区里,所以方法区也装了不少东西。

6.static特点

1、随着类的加载而加载

也就是说:静态会随着类的消失而消失,说明他的生命周期最长

7.int age(成员变量)实例变量和 staticint age(静态成员变量)类变量的区别

1、存放位置
实例变量是随着对象的创建而存在堆内存中
类变量随着类的加载而存在于方法区中
2、生命周期
实例变量随着对象的消失而消失
类变量生命周期最长,随着类的消失而消失 →静态使用注意事项
1、静态方法只能访问静态成员
2、静态方法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态方法中不可以出现this
→什么时候使用静态呢?

要从两个方面入手
因为静态修饰的内容有成员变量和成员方法(函数) 什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰
对象中的特有数据要定义成非静态存在于堆内存中。 什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义为静态的。
静态代码块
格式:
static
{
静态代码块中的执行语句;
}
//特点:随着类的加载而执行,只执行一次。用于给类进行初始化。
如下例子:
class StaticCode
{
static
{
System,out.println("a");
}
} 加载顺序 静态代码块-->构造代码块-->构造函数 对象的初始化过程
Person p = new Person("zhangsan",20);
1、因为new用到了Person.class。所以会先找到Person.class文件并加载到内存中。
2、执行该类中的static代码块(静态代码块),如果有的话,给Person.class类进行初始化
3、在堆内存中开辟空间,非配内存地址
4、在堆内存中建立对象的特有属性,并进行默认初始化
5、对属性进行显示初始化
6、对对象进行构造代码块初始化
7、对对象进行对应的构造函数初始化
8、将内存地址付给栈内存中的p变量
 

5.将数据存储在方法区有什么好处?

答:1.节省内存空间。因为方法区的数据是在类加载器加载类时候,填写进方法区的。同一个类,类加载器只会加载一次类。所以保证了方法区的内容都只存在一份。

class Person
{
String country = "cn";
}
/*每实例化一个Person对象,每个对象在堆内存中都有一个country
而加上static以后,就只在内存总存在一个静态的country被其他的对象直接调用,可以节省内存空间。
比如person类,每个中国人都有自己的名字,而国籍都是一样的中国,所以contry可以定义为static而name不用。

本文参考http://transcoder.baidu.com/from=2001a/bd_page_type=1/ssid=502f54484154495350414e1309/uid=0/pu=usm%400%2Csz%401320_2003%2Cta%40iphone_1_9.0_1_11.0/baiduid=5467C9315869C7DD0A81320AA41BD30F/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=17459822346989022625&order=1&fm=alop&tj=www_normal_1_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&title=static%28静态%29关键字的特点和用法-viLyo-博客园&dict=30&w_qd=IlPT2AEptyoA_yiGCE_tIi3uCVxVgZUnuky&sec=15378&di=b4193b3d2627bac0&bdenc=1&tch=124.0.0.0.0.0&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRAVDbzOXTTUS4stmGGe2dYtXLR0WYn7wV2mqxjxmdN7HzwdcbqhRS1JB1YcNkk2dq&eqid=f24dbfeb21b530001000000657e2cc1c&wd=&clk_info=%7B"srcid"%3A"1599"%2C"tplname"%3A"www_normal"%2C"t"%3A1474481456100%2C"xpath"%3A"div-div-div-a-p"%7D

和http://shenlvcheng.iteye.com/blog/864940

感谢作者

static关键字与方法区和类加载的更多相关文章

  1. this关键字、static关键字、方法的调用

    1.带有static关键字的方法,不可使用this关键字.因为其调用方法为类名.方法名(建议这种方式,调用不需要对象的参与),不存在对象. 2.实例方法调用必须有对象的存在,先创建对象,通过引用.的方 ...

  2. Java 底层机制(JVM/堆/栈/方法区/GC/类加载)

    转载:https://www.jianshu.com/p/ae97b692614e?from=timeline JVM体系结构 JVM是一种解释执行class文件的规范技术.   JVM体系结构 我翻 ...

  3. 面向对象编程(二)封装--构造方法,this关键字,static关键字,方法重载

    面向对象三大特点:封装.继承.多态 封装概念 ①   将东西包装在一起,然后以新的完整形式呈现出来: 将方法和字段一起包装到一个单元中,单元以类的形式实现; ②   信息隐藏,隐藏对象的实现细节,不让 ...

  4. Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

    (一)Eclipse中的快捷键:  ctrl+shift+f自动整理选择的java代码 alt+/ 生成无参构造器或者提升信息 alt+shift+s+o 生成带参构造 ctrl+shift+o快速导 ...

  5. 面向对象编程(七)——Static关键字

    Static变量

  6. 再议Java中的static关键字

    再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...

  7. Java精选笔记_面向对象(构造方法、this关键字、static关键字、内部类)

    构造方法constructor构造器 构造方法的定义 [修饰符]  类名 (形式参数列表){         //语句 } 构造器用于构造该类的实例.作用:用来初始化对象!一般由系统在创建对象(即类的 ...

  8. static关键字有何魔法?竟让Spring Boot搞出那么多静态内部类

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

  9. 【JVM第五篇--运行时数据区】方法区

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.栈.堆.方法区的关系 虚拟机运行时的数据区如下所示: 即方法区是属于线程共享的内 ...

随机推荐

  1. php取得当前时间函数

    php取得当前时间函数文章提供了php的几种获取当前时间的函数,date,time等哦,同时告诉我如何解决时区问题哦. php获取当前时间 使用函式 date() 实现 <?php echo $ ...

  2. 更新svn的客户端TortoiseSVN后 ,之前使用svn管理的文件的关联图标消失了

    说明:下面的解决方法及图片来自博客:装了SVN,你的关联图标变了没有? 解决办法:在同步的文件点击右键如下图   ...       现则Settings,出现的界面如下 ...            ...

  3. Asp.net Vnext 自定义日志

    概述 本文已经同步到<Asp.net Vnext 系列教程 >中] 可以通过自定义日志,把错误消息记录到数据库 实现 在启动文件Startup Configure方法中加入自定义的日志提供 ...

  4. ASP.NET MVC5+ 路由特性

    概述 ASP.NET MVC 5支持一种新的路由协议,称为路由特性. MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 案例 1.使用Visual Studio 20 ...

  5. LoadRunner对不同协议的选择

    LoadRunner对不同协议的选择 大家常用的是Loadrunner测试web(Http/Html),但其实协议多种多样.在B/S结构的网站多种业务的特点需要选择不同的协议,协议如何选择呢,寻找了相 ...

  6. web到service简单原理例子

    这是目前的理解 附上服务端源码 package com.lsw.server; import java.io.*; import java.net.*; import java.util.HashMa ...

  7. Windows-caffe配置

    我在博客园的第一篇博客开始了,好紧张,好激动,好淫荡...哈哈O(∩_∩)O哈! 下面开始进入正题.配置环境为windows7+cuda7.5+vs2013+matlab2014a 之前用的happy ...

  8. Java 中的异常

    前段时间集合的整理真的是给我搞得心力交瘁啊,现在可以整理一些稍微简单一点的,搭配学习 ~ 突然想到一个问题,这些东西我之前就整理过,现在再次整理有什么区别嘛?我就自问自答一下,可能我再次整理会看到不一 ...

  9. [leetcode tree]96. Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  10. 1035 Password (20)(20 point(s))

    problem To prepare for PAT, the judge sometimes has to generate random passwords for the users. The ...