1、内部类定义

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

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

 public final class Clazz {
private final class InnerClazz implements Runnable {
public InnerClazz() {
}
@Override
public void run() {
System.out.println("Hello world");
}
} public Clazz() {
}
public Runnable getRunnable(){
return new InnerClazz();
}
}

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

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 }

JAVA嵌套类:静态嵌套类和非静态嵌套类的更多相关文章

  1. JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)

    总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...

  2. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

  3. 浅谈Java中静态代码块和非静态代码块

    静态代码块: static{} 执行优先级高于非静态的初始化块,它会在类初始化(类初始化这个问题改天再详细讨论)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 非静 ...

  4. objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式

    objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令  的解决方式 图文By edata ,转载注明出处 http://www.cnblogs.com/edata 1 ...

  5. ERROR无法从静态上下文中引用非静态变量

    ERROR无法从静态上下文中引用非静态变量 2012-06-16 20:58:52 分类: Java 什么是“static”? 学习过java.C++或C的人都应该认识这个关键字.用这个关键字修饰的变 ...

  6. Java静态代码块与非静态代码块

    静态代码块,格式是 static{ },随着类的加载而加载,且只执行一次. 在程序中,执行的优先级最高. 非静态代码块,格式是{ },在创建对象的时候运行(即new一个对象的时候),每创建一次对象就执 ...

  7. Java中静态变量、静态代码块、非静态代码块以及静态方法的加载顺序

    在研究单例设计模式的时候,用到了静态变量和静态方法的内容,出于兴趣,这里简单了解一下这四个模块在类初始化的时候的加载顺序. 经过研究发现,它们的加载顺序为: 1.非静态代码块 2.静态变量或者静态代码 ...

  8. java多态成员变量、成员函数(非静态)、静态函数特点

    1 package face_09; 2 3 /* 4 * 多态时, 5 * 成员的特点: 6 * 1,成员变量. 7 * 编译时:参考引用型变量所属类中的是否有调用的成员变量,有,编译通过:没有,编 ...

  9. Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

    子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...

  10. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

随机推荐

  1. HDU 1042 N!(高精度乘)

    Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!   Input One N in ...

  2. 【转】CentOS: 开放80、22、3306端口操作

    #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT#/sbin/iptables -I INPUT -p tcp --dport 22 -j AC ...

  3. Alphabetic Removals(模拟水题)

    You are given a string ss consisting of nn lowercase Latin letters. Polycarp wants to remove exactly ...

  4. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  5. DAY3敏捷冲刺

    站立式会议 工作安排 (1)服务器配置 (2)数据库配置 燃尽图 燃尽图有误,已重新修改,先贴卡片的界面,后面补修改后燃尽图 代码提交记录

  6. DNS域名解析协议

    一. 根域 就是所谓的“.”,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输入时会省略后面的点,而这也已经成为了习惯. 根域服 ...

  7. OSG配置捷径,VS2013+WIN10

    在自己电脑上用CMAKE已经编译好了,上传到百度云里面了. 环境是WIN10+VS2013. 链接:http://pan.baidu.com/s/1hrO7GFE 密码:fwkw 解压之后放在C盘或者 ...

  8. jconsole工具监控数据分析

    当Jconsole连接成功后,它从JMX获取信息,我们便可以在里面监控具体的内容.Jconsole能捕获到以下信息: 概述 - JVM概述和一些监控变量的信息 内存 - 内存的使用信息 线程 - 线程 ...

  9. C# 开发者最经常犯的 8 个错误

    在和C#新手一起工作的时候,我注意到他们经常重复一些错误.这些错误,当你指出来的时候很容易理解.然而,如果一个开发者没有意识到这些错误,将会影响正在开发的软件的质量和效率,因此,我决定总结8个常见的错 ...

  10. chrome extensions & debug

    chrome extensions & debug debug background.js debug popup.js debug content_script.js chrome.stor ...