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, ...
随机推荐
- laravel Carbon函数
原文地址:https://blog.csdn.net/lbwo001/article/details/53063867 carbon官方网站:https://carbon.nesbot.com/doc ...
- 【python小记】访问mysql数据库
题记: 最近因为工作需要,学习了python,瞬间对这个轻松快捷的语给吸引了,以前只知道js脚本是写网页的,没有想到python这个脚本语言的应用范围可以这么广泛,现在做一些简单或稍微复杂的操作,基本 ...
- [转帖]腾讯将使用AMD第二代霄龙处理器打造自研服务器:性能提升35%
腾讯将使用AMD第二代霄龙处理器打造自研服务器:性能提升35% https://news.cnblogs.com/n/647499/ 我司的服务器是不是要少一块蛋糕了.. 作者:万南 今日,AMD 宣 ...
- 【转帖】两种IO模式:Proactor与Reactor模式
两种IO模式:Proactor与Reactor模式 https://www.cnblogs.com/pigerhan/p/3474217.html. 挺好的说明了epoll和IOCP的区别 在高性能的 ...
- kubernetes 实践二:kubectl命令使用
这里记录kubernetes学习和使用过程中的内容. CentOS7 k8s-1.13 flanneld-0.10 docker-18.06 etcd-3.3 kubectl用法概述 kubectl是 ...
- 深度自适应增量学习(Incremental Learning Through Deep Adaptation)
深度自适应增量学习(Incremental Learning Through Deep Adaptation) 2018-05-25 18:56:00 木呆呆瓶子 阅读数 10564 收藏 更多 分 ...
- go 学习笔记(3) 基础结构
package main import ( "fmt" ) const NAME string = "imooc" var a string = "慕 ...
- Linux ass2srt
Linux ass2srt bash script #! /usr/bin/env bash ] then echo "USAGE: $0 <directory> <fro ...
- Flutter 与 Android 的交互
https://juejin.im/post/5cd91de4518825686b120921 https://juejin.im/entry/5b64292be51d451995676398
- 【openshift】在Openshift上通过yaml部署应用
在Openshift上通过yaml部署应用 1.通过直接执行yaml 通过如下命令直接执行 oc create -f nginx.yml nginx.yml apiVersion: v1 items: ...