(转)Java基础——嵌套类、内部类、匿名类

本文内容分转自博客: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();

  静态内部类使用代码:

 1 静态内部类使用测试
 2
 3 package com.learnjava.innerclass;
 4
 5 class StaticInner
 6 {
 7     private static int a = 4;
 8
 9     // 静态内部类
10     public static class Inner
11     {
12         public void test()
13         {
14             // 静态内部类可以访问外部类的静态成员
15             // 并且它只能访问静态的
16             System.out.println(a);
17         }
18
19     }
20 }
21
22 public class StaticInnerClassTest
23 {
24
25     public static void main(String[] args)
26     {
27         StaticInner.Inner inner = new StaticInner.Inner();
28         inner.test();
29     }
30 }

成员内部类Member Inner Class

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

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

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

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

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

    this.new Innerclass();

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

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

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

    Outerclass.this.member

  详情见代码例子:

 1 成员内部类使用测试
 2
 3 package com.learnjava.innerclass;
 4
 5 class MemberInner
 6 {
 7     private int d = 1;
 8     private int a = 2;
 9
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     }
26
27 }
28
29 public class MemberInnerClassTest
30 {
31
32     public static void main(String[] args)
33     {
34
35         // 创建成员内部类的对象
36         // 需要先创建外部类的实例
37         MemberInner.Inner2 inner = new MemberInner().new Inner2();
38
39         inner.doSomething();
40     }
41 }

局部内部类Local Inner Class

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

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

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

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

 1 成员内部类使用测试
 2
 3 package com.learnjava.innerclass;
 4
 5 class LocalInner
 6 {
 7     int a = 1;
 8
 9     public void doSomething()
10     {
11         int b = 2;
12         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         }
30
31         // 创建局部内部类的实例并调用方法
32         new Inner3().test();
33     }
34 }
35
36 public class LocalInnerClassTest
37 {
38     public static void main(String[] args)
39     {
40         // 创建外部类对象
41         LocalInner inner = new LocalInner();
42         // 调用外部类的方法
43         inner.doSomething();
44     }
45
46 }

匿名内部类Anonymous Inner Class

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

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

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

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

 1 匿名内部类使用测试
 2
 3 package com.learnjava.innerclass;
 4
 5 import java.util.Date;
 6
 7 public class AnonymouseInnerClass
 8 {
 9
10     @SuppressWarnings("deprecation")
11     public String getDate(Date date)
12     {
13         return date.toLocaleString();
14
15     }
16
17     public static void main(String[] args)
18     {
19         AnonymouseInnerClass test = new AnonymouseInnerClass();
20
21         // 打印日期:
22         String str = test.getDate(new Date());
23         System.out.println(str);
24         System.out.println("----------------");
25
26         // 使用匿名内部类
27         String str2 = test.getDate(new Date()
28         {
29         });// 使用了花括号,但是不填入内容,执行结果和上面的完全一致
30             // 生成了一个继承了Date类的子类的对象
31         System.out.println(str2);
32         System.out.println("----------------");
33
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         });
47
48         System.out.println(str3);
49     }
50 }

  

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

 1 Swing中使用匿名内部类
 2
 3 package com.learnjava.innerclass;
 4
 5 import java.awt.event.ActionEvent;
 6 import java.awt.event.ActionListener;
 7 import java.awt.event.WindowAdapter;
 8 import java.awt.event.WindowEvent;
 9
10 import javax.swing.JButton;
11 import javax.swing.JFrame;
12
13 public class SwingTest
14 {
15     public static void main(String[] args)
16     {
17         JFrame frame = new JFrame("JFrame");
18         JButton button = new JButton("JButton");
19
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         });
31
32         //加入按钮
33         frame.getContentPane().add(button);
34
35         //设置关闭行为
36         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
37
38         frame.setSize(200, 200);
39
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         });
51         frame.setVisible(true);
52     }
53
54 }
时间: 2024-12-24 18:17:53

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

java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter

FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boo

使用模板方法模式+私有内部类+匿名类解决各个方法间代码结构类似的问题。

package org.hibernate.dao; import java.io.Serializable; import org.hibernate.*; import org.hibernate.entity.*; //使用模板方法模式+私有内部类+匿名类解决各个方法间代码结构类似的问题. public class UserDAOImpl implements UserDAO { private abstract class UserDAOTemplate{ abstract protec

java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上.如图所示: 1.管道输入流应该连接到管道输出流 ,输入流和输出流可以直接连接       2.使用多线程操作,结合线程进行操作.通常由某个线程从管道输入流中(PipedInputStream)对象读取.          并由其他线程将其写入到相应的端到输出流中.不能使用单线程

java基础知识回顾之javaIO类--RandomAccessFile类

java.io 类 RandomAccessFile java.lang.Object java.io.RandomAccessFile1.该类不是IO流中的子类.2.该类既能读又能写.3.该对象内部分装了一个字节数组,通过指针可以操作数组中的元素.4.其实该对象就是将字节输入流和输出流进行了封装.5.该对象只能对文件操作,目的和源只能是文件对象.通过看构造方法可以看得出来.RandomAccessFile(File file, String mode) RandomAccessFile(Str

java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

/** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中 * 3.将容器中的内容遍历,写入到指定文件中 * */ 代码:  FilenameFilter 过滤器: package com.lp.ecjtu.File.filter; import java.io.File; import java.i

java基础知识回顾之javaIO类--内存操作流ByteArrayInputStream和ByteArrayOutputSteam(操作字节数组)

直接看代码: package cn.itcast.io.p6.bytestream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class ByteArrayStreamDemo { /** * @param args * @throws IOException * 特点 * 1.内存操作流 * 2.不操作底层资源,不调

java基础知识回顾之javaIO类--File类应用:删除带内容的目录

/** * 深度删除一个带内容的目录 * 原理:必须从里往外删除,需要深度遍历 * @author Administrator * */ public class FileDeleteList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File("E:\\复件 demodir"); removedir(

java基础知识回顾之javaIO类--File类应用:递归深度遍历文件

代码如下: package com.lp.ecjtu.File.FileDeepList; import java.io.File; public class FileDeepList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File("E:"+File.separator+"demodir

java基础知识回顾之javaIO类--File类

File类是对文件系统中文件以及目录(文件夹)进行封装的对象,可以通过面向对象的思想来操作文件和目录(文件夹).File类保存文件或目录的各种元素的信息,包括文件名,文件长度,最后修改日期,是否可读,获取当前文件的路径名,判断指定文件是否存在,获得当前文件的列表,创建.删除文件目录等方法. /**     * 构造方法:File f = new File("file.txt");//file.txt 相对路径     *       File f1 = new File("c

Java基础教程:内部类

Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass {   . . .   public class NestedClass {   . . .     } } 内部类拥有访问外部类所有元素(包括private.static)的访问权.当某个外部类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用.然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员. 内部类