博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA嵌套类:静态嵌套类和非静态嵌套类
阅读量:5209 次
发布时间:2019-06-14

本文共 2055 字,大约阅读时间需要 6 分钟。

1、内部类定义

  内部类在维基百科的为:  面向对象编程中,内部类(又叫做嵌套类)是在另一个类或者接口中进行声明的类。内部类不同于子类(subclass)。(译者注:wiki的注解有误,内部类和嵌套类并不完全等同,详见下文。)

  在Java中,上面的定义可以如下示例:

1 public final class Clazz { 2     private final class InnerClazz implements Runnable { 3         public InnerClazz() { 4         }            5         @Override 6         public void run() { 7             System.out.println("Hello world");          8         }    9     }     10     11     public Clazz() {12     }     13     public Runnable getRunnable(){14         return new InnerClazz();   15     } 16 }

  上面这个示例除了声明了一个内部类之外,没做其他任何事情。我举这个例子是想强调嵌套类和内部类的不同,因为不是所有的程序员都理解这一点。

2、内部类(Inner class

  上面的示例代码中声明了一个内部类“InnerClazz”。每次调用getRunnable方法的时候InnerClazz类的实例就会被创建出来。如果你在FindBugs中调试这段代码,你会看到下面这条警告信息: SIC:应该是个静态内部类(SIC_INNER_SHOULD_BE_STATIC) 。 这个类是一个由其外部对象创建的内部类,但是它没有使用内置的指向外部对象的引用。这个引用可以使得内部类实例更大,并且可以使得外部对象的生存期尽可能长。如果可能,这个类应该被定义成静态的。

  这条警告信息很明确:内部类会保留一个指向其父类的引用,因此只要InnerClazz类被引用了,其父类就不能被JVM的垃圾回收机制自动垃圾回收(内部类和其父类的引用关系是很稳固的,你可以通过这篇文章了解更多)。如果你想使用这个引用,下面这种嵌套类是非常有用的:

1 public final class Clazz { 2 private final class InnerClazz implements Runnable { 3 public InnerClazz() { 4 } 5 @Override 6 public void run() { 7 // print the value of a member of its "parent" class 8 // it's possible because the inner class has an implicit reference 9 // on the Clazz instance 10 System.out.println(_currentNumber); 11 } 12 } 13 private int _currentNumber = 0; 14 public Clazz() { 15 } 16 public Runnable getRunnable() { 17 _currentNumber++; 18 return new InnerClazz(); 19 } 20 }

3、非内部类的嵌套类(Nested but not inner class)

  如果你并不需要保留Clazz实例和InnerClazz实例之间的非常稳固的引用关系,那么就将InnerClazz声明为一个静态成员类(下面的例子中的NestedNotInnerClazz类)。

1 public final class Clazz { 2 // static keyword is added 3 static private final class NestedNotInnerClazz implements Runnable { 4 public NestedNotInnerClazz() { 5 } 6 @Override 7 public void run() { 8 System.out.println("Hello world"); 9 } 10 } 11 12 public Clazz() { 13 } 14 public Runnable getRunnable(){ 15 return new NestedNotInnerClazz(); 16 } 17 }

转载于:https://www.cnblogs.com/ChinaHook/p/4949805.html

你可能感兴趣的文章
Swift - 异步加载各网站的favicon图标,并在单元格中显示
查看>>
Java编程思想总结笔记Chapter 5
查看>>
51 nod 最大距离
查看>>
[LeetCode]662. Maximum Width of Binary Tree判断树的宽度
查看>>
WinForm聊天室
查看>>
ASCII码表含义
查看>>
Updlock 与 Holdlock
查看>>
Python 从零学起(纯基础) 笔记(一)
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
Java 线程安全问题
查看>>
selenium学习中遇到的问题
查看>>
大数据学习之一——了解简单概念
查看>>
P1-13:集成日志组件 logback 2彩色日志
查看>>
昨天开始接任务
查看>>
Linux升级内核教程(CentOS7)
查看>>
JDK5.0 特性 监控与管理虚拟机
查看>>
Lintcode: Partition Array
查看>>
分享适合个人站长的5类型网站
查看>>
类别的三个作用
查看>>