专栏首页好派笔记static声明代码块内部类方式之一:推荐
原创

static声明代码块内部类方式之一:推荐

static声明代码块内部类方式--推荐:

public class Test {
    private static class MyObject {
        public static Test uniqueInstance = new Test();
    }

    private Test() {
    }

    public static Test getInstance() {
        return MyObject.uniqueInstance;
    }
}

  在内部类方式中,使用了一个专门的类来初始化Test。JVM将推迟Test的初始化操作,直到开始使用这个类时才初始化,并且由于通过一个静态初始化来初始化Test,因此不需要额外的同步。 当任何一个线程第一次调用getInstance时,都会使Test被加载和被初始化,此时静态初始化器将执行Test的初始化操作。

static声明代码块

  static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会自动执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次(除初始化静态变量的一些公共处理语句可以放在这里。比如:当一个类需要在被载入时就执行一段程序,这样可以使用静态程序块)。

静态对象的好处

   静态变量、静态代码块和静态方法都属于静态对象,我们上面总结了他们的特点,这里说明静态对象的好处:

静态对象的数据在全局是唯一的。任何一处地方修改了静态变量的值,在程序所有使用到的地方都将会体现到这些数据的修改。 非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。 引用方便。直接用 类名.静态方法名 或者类名.静态变量名就可引用并且直接修改其属性值,不用get和set方法。 节约空间。静态变量和静态方法属于类,在内存中只有一个复制(所有实例都指向同一个内存地址--方法区) 由于静态对象的初始化是在类加载的初始化阶段进行,在实例化对象的构造函数返回时一定已经初始化完成,因此可以用于安全的发布对象,当然对象发布后的安全性要靠其他措施来保证。

坏处:

  1. 类属性中被static所引用的变量,会被作为GC的root根节点。作为根节点就意味着,这一类变量是基本上不会被回收的。因此,static很容易引入内存泄漏的风险。

static声明内部类

   静态内部类是指在一个类的内部,又定义了一个用static修饰的类。它可以不依赖于外部类实例对象而被实例化,但他不能访问外部类的普通成员变量和普通成员方法,只能访问外部类的static成员(包括私有类型)。 一个没有被static修饰的内部类,必须要这么声明。

OutterClass.InnerClass innerClass = new OutterClass().new InnerClass();

如果你使用了static修饰,那么你就可以这样使用内部类。

OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass();

   这两种方式最大的区别就是,第一种方式,如果你想要获得InnerClass的实例,你必须有一个OutterClass的实例,所有其实这种方式你创建了两个实例,所以有两个new关键字。而第二种方式就好理解一些,静态内部类不依赖于外部类的实例存在,因此只需要直接创建内部类的实例就可以了,所以只有一个new关键字。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java开发手册-并发处理

    自定义线程工厂,并且根据外部特征进行分组,比如,来自同一机房的调用,把机房编号赋值给

    Vincent-yuan
  • 函数

    在定义的函数的时候,如果在函数定义前调用,需要在调用的前面加上一个函数声明 告知这个函数存在

    DeROy
  • Builtin Lint Detectors (1)

    本文主要介绍的是Lint工具中自带的与Android开发相关的lint检查项,通过查看lint检查项的描述及其代码实现,我发现这里面存在不少应用开发编码的Bes...

    宅男潇涧
  • Java基础(4)-Java标识符和关键字

    本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/173

    joshua317
  • 单例模式 实现

    上面那种直接在方法上加锁的方式其实不够好,因为在方法上加了内置锁在多线程环境下性能会比较低下,所以我们可以将锁的范围缩小

    Krry
  • 8种常见的Java不规范代码

    在工作上,我最近对一个现有的Java项目代码进行了清理。完成之后,我发现了一些反复出现的不规范代码。所以,我把它们整理成了一个列表出来分享给我的同行希望能引起注...

    哲洛不闹
  • 8种常见的Java不规范代码

    在工作上,我最近对一个现有的Java项目代码进行了清理。完成之后,我发现了一些反复出现的不规范代码。所以,我把它们整理成了一个列表出来分享给我的同行希望能引起注...

    哲洛不闹
  • 8种常见的Java不规范代码

    在工作上,我最近对一个现有的Java项目代码进行了清理。完成之后,我发现了一些反复出现的不规范代码。所以,我把它们整理成了一个列表出来分享给我的同行希望能引起注...

    哲洛不闹
  • 工匠人iOS 代码规范

    在多个不同的运算符同时存在的时候应该合理使用括号,不要盲目依赖操作符优先级。 因为有的时候不能保证阅读你代码的人就一定能了解你写的算式里面所有操作符的优先级。

    用户3098942
  • 《Java开发手册》

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    chenchenchen
  • Java编程风格

    Java编程的风格介绍,主要参考乐google的java code style。对模糊部分作出了明确的选择。

    白凡
  • GB代码规范1.0

    对于如果导入是UIKit类就使用UIKIT_EXTERN 如果是Founction使用关键词FOUNDATION_EXTERN

    君赏
  • 《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    先扯两句闲话,前段时间加了一个粉丝,他告诉我说他们老师在班级群里推荐了我,我当时听到都懵了。。。

    拓跋阿秀
  • Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避

    【强制】Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该通过 catch 来处理,比如: IndexOutOfB...

    聚名12255
  • 设计模式 ☞ 创新型模式之单例模式

      单例(Singleton)模式的定义:是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。例如,Windows 中只能...

    Demo_Null
  • java编码规范

    java编码规范(日常编码总结,规范项目组员有统一的规范,方便合作,查错,重构等)当你抛弃规范随心所意的写代码时,等你之后再回来阅读时真有的一种全部删掉重写的冲...

    凯哥Java
  • 单例模式--双重检验锁真的线程安全吗

    单例模式是我们最熟悉不过的一种设计模式,用来保证内存中只有一个对象的实例。虽然容易,但里面的坑也有很多,比如双重检验锁模式(double checked loc...

    程序员小明
  • 给大忙人写的单例模式的八种实现方法

    TrueDei
  • Java 基础语法知识 - 万丈高楼平地起

    为满足移动端和PC端的双重阅读体验,以及文章质量的保证,开始重构的以及新写的文章都会基于 “语雀” 平台编写,公众号会同步刚发布的文章,但随后的修改或者更新只会...

    BWH_Steven

扫码关注云+社区

领取腾讯云代金券