• 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,情况更加严重。

  • 相关阅读:
    问题解决:访问自己搭建网页时出现:此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。
    cracer教程5----漏洞分析(下)
    cracer教程3----信息收集
    linux3
    pwdump7的用法及其hash值解密
    maven scope含义的说明
    Spark2.0协同过滤与ALS算法介绍
    Jmeter压力测试工具安装及使用教程
    过滤器(Filter)与拦截器(Interceptor )区别
    @Value()读取配置文件属性,读出值为null的问题
  • 原文地址:https://www.cnblogs.com/zhizhiyin/p/11833802.html
Copyright © 2020-2023  润新知