本文内容分转自博客:http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html

将相关的类组织在一起,从而降低了命名空间的混乱。

  一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。

  Java中的内部类共分为四种

  静态内部类static inner class (also called nested class)

  成员内部类member inner class

  局部内部类local inner class

  匿名内部类anonymous inner class

静态内部类Static Inner Class

  最简单的内部类形式。

  类定义时加上static关键字。

  不能和外部类有相同的名字。

  被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式

  只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。

  生成静态内部类对象的方式为:

    OuterClass.InnerClass inner = new OuterClass.InnerClass();

  静态内部类使用代码:

 静态内部类使用测试

 package com.learnjava.innerclass;

 class StaticInner
{
private static int a = 4; 9 // 静态内部类
10 public static class Inner
11 {
12 public void test()
13 {
14 // 静态内部类可以访问外部类的静态成员
15 // 并且它只能访问静态的
16 System.out.println(a);
17 }
18
19 }
} public class StaticInnerClassTest
{ public static void main(String[] args)
{
27 StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
}
}

成员内部类Member Inner Class

  成员内部类也是定义在另一个类中,但是定义时不用static修饰。

  成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。

  成员内部类就像一个实例变量。

  它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以

  在外部类里面创建成员内部类的实例:

    this.new Innerclass();

  在外部类之外创建内部类的实例(必须通过外部类的实例去创建):

    (new Outerclass()).new Innerclass();

  在内部类里访问外部类的成员:

    Outerclass.this.member

  详情见代码例子:

 成员内部类使用测试

 package com.learnjava.innerclass;

 class MemberInner
{
private int d = 1;
private int a = 2; 10 // 定义一个成员内部类
11 public class Inner2
12 {
13 private int a = 8;
14
15 public void doSomething()
16 {
17 // 直接访问外部类对象
18 System.out.println(d);
19 System.out.println(a);// 直接访问a,则访问的是内部类里的a
20
21 // 如何访问到外部类里的a呢?
22 System.out.println(MemberInner.this.a);
23 }
24
25 } } public class MemberInnerClassTest
{ public static void main(String[] args)
{ // 创建成员内部类的对象
// 需要先创建外部类的实例
37 MemberInner.Inner2 inner = new MemberInner().new Inner2(); inner.doSomething();
}
}

局部内部类Local Inner Class

  局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。

  像局部变量一样,不能被public, protected, private和static修饰

  只能访问方法中定义的final类型的局部变量。

  局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法

 成员内部类使用测试

 package com.learnjava.innerclass;

 class LocalInner
{
int a = 1; public void doSomething()
{
int b = 2;
final int c = 3;
13 // 定义一个局部内部类
14 class Inner3
15 {
16 public void test()
17 {
18 System.out.println("Hello World");
19 System.out.println(a);
20
21 // 不可以访问非final的局部变量
22 // error: Cannot refer to a non-final variable b inside an inner
23 // class defined in a different method
24 // System.out.println(b);
25
26 // 可以访问final变量
27 System.out.println(c);
28 }
29 } 31 // 创建局部内部类的实例并调用方法
32 new Inner3().test();
}
} public class LocalInnerClassTest
{
public static void main(String[] args)
{
// 创建外部类对象
LocalInner inner = new LocalInner();
// 调用外部类的方法
inner.doSomething();
} }

匿名内部类Anonymous Inner Class

  匿名内部类就是没有名字的局部内部类不使用关键字class, extends, implements, 没有构造方法

  匿名内部类隐式地继承了一个父类或者实现了一个接口

  生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。

  匿名内部类使用得比较多,通常是作为一个方法参数。

 匿名内部类使用测试

 package com.learnjava.innerclass;

 import java.util.Date;

 public class AnonymouseInnerClass
{ @SuppressWarnings("deprecation")
public String getDate(Date date)
{
return date.toLocaleString(); } public static void main(String[] args)
{
AnonymouseInnerClass test = new AnonymouseInnerClass(); // 打印日期:
String str = test.getDate(new Date());
System.out.println(str);
System.out.println("----------------"); 26 // 使用匿名内部类
27 String str2 = test.getDate(new Date()
28 {
29 });// 使用了花括号,但是不填入内容,执行结果和上面的完全一致
30 // 生成了一个继承了Date类的子类的对象

System.out.println(str2);
System.out.println("----------------"); 34 // 使用匿名内部类,并且重写父类中的方法
35 String str3 = test.getDate(new Date()
36 {
37
38 // 重写父类中的方法
39 @Override
40 @Deprecated
41 public String toLocaleString()
42 {
43 return "Hello: " + super.toLocaleString();
44 }
45
46 }); System.out.println(str3);
}
}

  

  Swing中使用内部类的例子如下:

 Swing中使用匿名内部类

 package com.learnjava.innerclass;

 import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.JButton;
import javax.swing.JFrame; public class SwingTest
{
public static void main(String[] args)
{
JFrame frame = new JFrame("JFrame");
JButton button = new JButton("JButton"); 20 button.addActionListener(new ActionListener()
21 {
22 // new出来一个实现了ActionListener接口的类的实例
23
24 @Override
25 public void actionPerformed(ActionEvent arg0)
26 {
27 System.out.println("Hello World");
28
29 }
30 }); //加入按钮
frame.getContentPane().add(button); //设置关闭行为
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); 40 frame.addWindowListener(new WindowAdapter()
41 {
42 //也可以使用继承了适配器类的匿名内部类
43 @Override
44 public void windowClosing(WindowEvent e)
45 {
46
47 System.out.println("Closing");
48 System.exit(0);
49 }
50 });
frame.setVisible(true);
} }

(转)Java基础——嵌套类、内部类、匿名类的更多相关文章

  1. Java基础-类加载机制与自定义类Java类加载器(ClassLoader)

    Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...

  2. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

  3. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

  4. Java基础教程:内部类

    Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass {   . . .   public class Nest ...

  5. Java基础 -- 嵌套类(非静态嵌套类、静态嵌套类)

    可以将一个类的定义放在另一个类的内部定义,这样的类就被称为嵌套类,包含嵌套类的类被称为外部类(outer class),也可以叫做封闭类. 嵌套类可以分为两种: 静态嵌套类(Static Nested ...

  6. Java入门教程十(抽象类接口内部类匿名类)

    抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...

  7. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

  8. Java基础——数组应用之StringBuilder类和StringBuffer类

    接上文:Java基础——数组应用之字符串String类 一.StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和 ...

  9. Java基础之处理事件——使用适配器类(Sketcher 3 using an Adapter class)

    控制台程序. 适配器类是指实现了监听器接口的类,但监听器接口中的方法没有内容,所以它们什么也不做.背后的思想是:允许从提供的适配器类派生自己的监听器类,之后再实现那些自己感兴趣的类.其他的空方法会从适 ...

随机推荐

  1. [dts]Device Tree机制

    转自:http://blog.csdn.net/machiner1/article/details/47805069 ------------------Based on linux 3.10.24 ...

  2. mongodb的读写分离

    转自:http://blog.csdn.net/sd0902/article/details/21538621 mongodb的读写分离使用Replica Sets来实现 对于replica set ...

  3. 黄聪:C#中WebClient自动判断编码是UTF-8还是GBK,并且有超时判断功能

    public class WebDownload : WebClient { private int _timeout; /// <summary> /// 超时时间(毫秒) /// &l ...

  4. wordpress主题结构_源码

    WordPress博客主题的工作机制 WordPress主题由一系列模板文件组成,每个文件分别控制主题的特定区域.无论你处于哪个页面都能看到的网站的静态部分,由header文件.sidebar和foo ...

  5. ROM, RAM, Flash Memory

    ROM Read-only memory (ROM) is a class of storage medium used in computers and other electronic devic ...

  6. 纯c++实现之滚动窗口

    别在MFC了,先分析下,上图 我们以左上角为坐标原点,用position_width和position_height来保存当前显示坐标. 根据msdn说明,滚动条默认情况下的值在0~100之间. 根据 ...

  7. NeHe OpenGL教程 第四课:旋转

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. BarTender破解问题

    要使用BarTender 10.0的.net组件打印条码,就必须使用企业版的.在破解说明中会指出,BarTender破解过程要断开internet连接.在企业应用开发中,可能会遇到在局域网中给多个机器 ...

  9. 转载__Java内部类

    内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权 ...

  10. 九度OJ1061

    //C++ sort函数的多重排序 #include <iostream> #include<algorithm> #include<string> using n ...