美文网首页
关于java静态内部类的思考

关于java静态内部类的思考

作者: 元勰 | 来源:发表于2016-10-31 23:11 被阅读0次

前言

最近在看多线程,讲到单例模式安全问题的时候。提到了单例的第四种模式——InnerClass模式。里面提到这种是用的最多的方式。很好奇里面的写法,然后就对静态内部类加载产生了疑问。故写了以下的代码实验一下。

代码1

我们利用静态代码块随着类的加载而执行这一特征,对静态内部类进行了测试。

public class StaticClassTest {

 static {
  System.out.println("this is static outter calss");
 }
​
 public static class Innclass {
  static {
   System.out.println("this is static inner class");
  }
 }
​
 public static void main(String[] args) {
  new StaticClassTest();//修改在这里
  System.out.println("------------我是华丽的分割线-----------");
  new StaticClassTest.Innclass();
 }
​
}
​```

这段代码的运行结果是

this is static outter calss

------------我是华丽的分割线-----------
this is static inner class
​```

这里面看到先是外部类加载,然后在调用内部类创建对象的时候,才会去加载静态内部类。这点和静态成员随着类一起加载有出入。而后,我对代码进行一些修改。

代码2

public class OutterClassTest {

​
 public static void main(String[] args) {
  new Outter();//修改在这里

  System.out.println("-------我是华丽的分割线--------");
  new Outter.Inner();
 }
​
}
​
class Outter {
 static {
  System.out.println("this is outter class loading ");
 }
 

 public static class Inner {
  static {
   System.out.println("this is inner calss loading ");
  }
 }
}

这段代码我将静态类的外部类和测试类分开。执行主方法后,得到如下结果:

this is outter class loading 
-------我是华丽的分割线--------
this is inner calss loading 

这和上面一段代码没什么区别。但是,当我们将调用外部类的方法创建对象这句话分别注释掉的时候。其结果就发生了变化:
代码1

this is static outter calss
------------我是华丽的分割线-----------
this is static inner class
​```

代码2

-------我是华丽的分割线--------
this is inner calss loading

##总结
很明显在这里面,代码1由于是main函数所在的类,必须加载。所以,静态代码块先执行。没什么问题。但主要问题在代码2上,为什么直接调用静态内部类创建对象的时候,外部类都没有加载。
这说明,静态内部类作为一种特殊的类成员有如下两个特征:
1. 加载时间随着调用而加载。而不是和外部类一起加载。

2. 静态内部类作为一个类,是可以单独使用,而不需要加载任何外部类代码的。

以上是我对静态内部类特性的一些总结,如有错误,欢迎指正。谢谢

相关文章

  • Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类静态内部类匿名类本地类 步骤 1 : 非静态内部类 非静态内部类 ...

  • 内部类

    内部类可以分为:非静态内部类;静态内部类;匿名内部类。 一、内部类 首先要说,Java为什么要使用内部类?java...

  • Java内部类使用

    内部类 在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。 非静态态内部类...

  • java之内部类(InnerClass)详解

    参考文章 java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类

  • 关于java静态内部类的思考

    前言 最近在看多线程,讲到单例模式安全问题的时候。提到了单例的第四种模式——InnerClass模式。里面提到这种...

  • Java 中的静态内部类

    Java 中的静态内部类 静态内部类是 static 修饰的内部类,这种内部类的特点是: 1、 静态内部类不能直接...

  • Java静态内部类

    Java静态内部类 博客分类: java 两种内部类 Java的内部类有两种,一种是静态内部类,另一种是普通内部类...

  • Java学习——内部类

    内部类 一,成员内部类(包括静态内部类和非静态内部类) 非静态内部类可以直接访问外部类的成员,反之则不行 非静态内...

  • (java知识小总结二)2018-05-31

    5.2Java 中的静态内部类:静态内部类是 static 修饰的内部类 特点:(1)、 静态内部类不能直接访问外...

  • 关于非静态内部类为什么不能有静态成员的实践

    导引 作为java开发者,我们都知道内部类分为静态内部类和非静态内部类。非静态内部类不能有静态成员(不包括静态常量...

网友评论

      本文标题:关于java静态内部类的思考

      本文链接:https://www.haomeiwen.com/subject/nznputtx.html