java -static的特性和使用,静态类/方法/块/内部类/回收机制
mark一下,今天的作业。
java-core P115
如果将域定义为static,每个类中只有一个这样的域。(这里的域应该是指一片物理数据空间,而不是单纯的指代某一个变量,而是静态域)。
public class Test1st {
public static int aaa=1;
public static int bbbb=2;}
public class Testabc {
@Test
public void testTest(){
System.out.println("aaa:"+Test1st.aaa+",bbb:"+Test1st.bbbb);
}
}
com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 test.Testabc,testTest
aaa:1,bbb:2
Process finished with exit code 0
每个对象对于自己的实例域都有自己的一份拷贝,静态域属于类,不属于任何独立的对象。
静态方法是一种不能向对象实施操作的方法。
以下两种情况下使用静态方法:
1.一个方法不需要访问对象状态,所有参数都是通过显示参数提供。
2.一个方法只需要访问类的静态域,例如(Employee.getNextId)
工厂模式中用static关键字较多,每个类对象都可以对公有域进行修改,但是公有常量(final)不可以,final+static+public的合用可以避免公有常量被类对象修改。即避免公有方法中的常量对象被新的对象覆盖和修改,从而影响到公有常量的正确性。
e.g
public class System{
...
public static final PrintStream out=...;
...
}
System.out =new PrintStream(...);//ERROR- out is final
静态内部类
1.内部类的概念:定义在一个类中的类,可以访问该类作用域中的数据,包括private的数据,且对同个package中的其他类隐藏。
2.有时候使用内部类只是为了把一个类隐藏在另一个类的内部,而不需要内部类引用外部类对象。可以将内部类声明为static,以便取消产生的引用。(该内部类不需要引用外部对象,而外部对象需要完成一些操作但是不想重新创建一个其他的类,于是创建一个内部类,在外部对象中直接调用这个内部类的方法,该内部类如果不是static,会在被引用时报错。P244)
回收机制(自己总结的,可能有误,请参考多方)
类相关的信息加载后是存储在Method Area(线程公有部分,存储包括类信息,常量,静态变量,编译器代码等,如HotSpot的永久代)中,一般除了classloader卸载该类,那么该部分的信息不会被回收掉。
方法区得回收一般是针对常量池和对类的卸载。当方法区无法满足内存分配需求时,会发生OOM。
以此导致的内存泄漏问题类型较多。
内存泄漏相关:
Android 参考
1.类的静态变量持有大数据对象:静态变量长期维持对象的引用,阻止垃圾回收。
public static final Bitmap=......;
2.非静态内部类的静态实例
非静态内部类会维持一个到外部类实例的引用,如果非静态内部类维持的这个实例是静态的,就会间接长期维持着外部类的引用,阻止被系统回收
3.Handler临时性内存泄漏(*)
Handler非静态,在与MessageQueue和Activity/Service之间交流时,如果Message在Queue中等待时间过长,会导致handler不会被回收。如果Handler是非静态的,会导致Acitivity或者Service不会被回收。
4.容器中的对象没清理
通常把一些对象的引用加入集合中,如果不需要该对象时,如果没有把引用从集合中清理掉,这个集合就会越来越大,如果这个集合时static,情况更加严重。
java -static的特性和使用,静态类/方法/块/内部类/回收机制的更多相关文章
- Java笔记——Java8特性之Lambda、方法引用和Streams
Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
新语法 方法引用Method references Lambda语法 Lambda语法在AndroidStudio中报错 Stream API 我正参加2016CSDN博客之星的比赛 希望您能投下宝贵 ...
- Java 8 新特性--Lambda表达式作为方法参数
Lambda表达式的使用场景: 当方法的参数是一个函数式接口时,可以使用Lambda表达式进行简化—— 首先,前提是Runnable接口是一个函数式接口,经过查看源码得知,确实如此: 将Runnabl ...
- JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常
在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...
- Java中的内存泄露 和 JVM GC(垃圾回收机制)
一.什么是Java中的内存泄露? 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点, 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连:其次,这些对象是无用的,即程序以 ...
- 深入理解JVM内幕:从基本结构到Java 7新特性
转自:http://www.importnew.com/1486.html 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境 ...
- Java8特性之Lambda、方法引用以及Stream流
Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...
- 深入理解JVM内幕:从基本结构到Java 7新特性[转]
英文原文:cubrid,编译:ImportNew - 朱伟杰 译文链接:http://www.importnew.com/1486.html [如需转载,请在正文中标注并保留原文链接.译文链接和译者等 ...
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...
随机推荐
- Ubuntu查看与结束任务进程
1.打开终端 2.敲 ps -ef 查出进程的编号(就是PID那列) 3.输入 kill PID 即可(如果PID是123456,则kill 123456) 例如: 我想把splash关闭,直接输 ...
- springboot实战日记(一)数据库基本信息
摘要:基于spring boot的后端实现,开发一个微信小程序点餐系统,主要是写写思路和遇到的问题以及分享读到的好文章. 项目分析: 1.角色划分,就是开有什么人使用这个系统,买家(手机端),卖家(p ...
- python基础(三)-- 文件操作
一. 文件操作: 对文件操作流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 现有文件如下 : Somehow, it seems the love I kn ...
- hdfs、tfs、fastdfs、Tachyon
hdfs 架构设计 HDFS按照Master和Slave的结构.分NameNode.SecondaryNameNode.DataNode这几个角色. NameNode:是Master节点,是管理者.. ...
- Servlet知识点小结
Servlet: server applet * 概念:运行在服务器端的小程序 * Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则. * 将来我们自定义一个类,实 ...
- shell分享
shell脚本分享 一.介绍shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...
- Luogu4707 重返现世 min-max容斥、DP
传送门 kthMinMax的唯一模板? 首先你需要知道kth Min-Max定理的内容:\(kthmax(S) = \sum\limits_{T \subseteq S} (-1)^{|T| - k} ...
- vim操作常用命令总结
这里记录下linux在vim编辑器中的常用命令 vi 的三种模式: 一般模式:以vi打开一个文件时,就是一般模式:可以移动光标,删除字符或删除整行,可以复制.粘贴等操作 编辑模式:在一般模式按下 i ...
- C#判断字符串中包含某个字符的个数
//定义字符串 var Email= "humakesdkj@idsk@"; //获取@字符出现的次数 int num = Regex.Matches(Email, "@ ...
- 你有自信写while(true)吗?
每次写while(true)的时候会不会心虚? 特别逻辑稍微复杂一点