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, ...
随机推荐
- 面试之leetcode两数求和
1 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...
- SpringBoot+Mybatis+MySql 自动生成代码 自动分页
一.配置文件 <!-- 通用mapper --> <dependency> <groupId>tk.mybatis</groupId> <arti ...
- Linux系统下Redis单机版的安装详细教程
Linux系统下Redis单机版的安装详细教程 1.下载软件安装包并上传到root目录 这里以旧版本的3.0进行安装,比较成熟稳定,具体软件可以通过qq群534073451文件下载
- Word 中直引号和弯引号的相互替换
直引号替换成弯引号 弯引号替换成直引号 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)
- Redis-缓存有效期与淘汰策略
Redis-缓存有效期与淘汰策略 有效期 节省空间 做到数据弱一致性,有效期失效后,可以保证数据的一致性 过期策略 Redis过期策略通常有三种: 1.定时过期: 每个设置过期时间的Key,系统还要生 ...
- 11 IO流(八)——装饰器设计模式,Filter装饰流
声明:本文部分图片及内容引用自:https://www.cnblogs.com/qiumingcheng/p/5219631.html java装饰器设计模式 举一个形象的例子,人可以说话,而扩音器可 ...
- go 学习笔记(4) --变量与常量
“_” 可以理解成一个垃圾桶,我们把值赋给“_” ,相当于把值丢进垃圾桶,在接下来的程序中运行中不需要这个下划线这个值 a,b :=1,2 只能用在函数体内 package main impor ...
- go 学习笔记(3)benchmark
benchmark函数以benchmark开头 benchmark的case一般会跑b.N次,且每次执行都如此 在执行过程中会根据实际case的执行时间是否稳定会增加b.N的次数以达到稳态. pack ...
- Disruptor分布式id生成策略
需要的pom文件: <!-- 顺序UUID --> <dependency> <groupId>com.fasterxml.uuid</groupId> ...
- 基于node.js 的 websocket的移动端H5直播开发
这一篇介绍一下基于node.js 的 websocket的移动端H5直播开发, 下载文章底部的源码,我是用vscode打开, 首先在第一个终端运行 npm run http-server 这个指令是运 ...