Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)
Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
内部类的主要作用:使用内部类可以减少命名冲突。
定义位置:一个内部类可以定义在一个类中,也可以在一个方法中,甚至在一个表达式中。
广义上讲,内部类分为四种:
静态内部类(static inner classes)
成员内部类(member inner classes)
局部内部类(local inner classes)
匿名内部类(anonymous inner classes)
1、静态内部类(static inner classes)
最简单的内部类。
只能访问外部类的静态成员变量与静态方法。
生成静态内部类对象的方法:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
相关使用例子:静态内部类
1 class StaticInner{
2 private static int a = 1;
3 /**
4 * 静态内部类
5 * 生成的类名:StaticInner$InnerClass
6 */
7 public static class InnerClass{
8 //静态内部类可以声明静态的成员变量,其他的内部类不可以
9 private static int b = 1;
10 public void execute(){
11 //静态内部类只能访问静态程序
12 System.out.println(a + b);
13 }
14 }
15 }
//main方法中使用:
16 public static void main(String[] args) {
17 //创建静态内部类
18 StaticInner.InnerClass innerClass = new StaticInner.InnerClass();
19 innerClass.execute();
20 }
2、成员内部类(member inner classes):
成员内部类可以访问外部类的静态与非静态的方法和成员变量。
生成成员内部类对象的方法:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
在局部内部类中访问外部类的成员变量的方法:
OuterClass.this.a;
相关使用例子:成员内部类
1 class MemberInner{
2 private int a = 1;
4 public void execute(){
5 //在外部类中创建成员内部类
6 InnerClass innerClass = this.new InnerClass();
7 }
9 /**
10 * 成员内部类
11 */
12 public class InnerClass{
14 //内部类可以创建与外部类同名的成员变量
15 private int a = 2;
17 public void execute(){
18 //this引用的是内部类
19 System.out.println(this.a);
20 //在内部了中使用外部类的成员变量的方法
21 System.out.println(MemberInner.this.a);
22 }
23 }
24 }
//在main方法中使用:
1 public static void main(String[] args) {
2 //创建成员内部类
3 MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
4 innerClass.execute();
5 }
3、局部内部类(local inner classes):
类似于局部变量,不能定义为public,protected,private或者static类型。
定义方法中,只能方法中声明为final类型的变量。
相关使用例子:局部内部类
1 class LocalInner{
3 public void execute(){
4 final int a = 1;
5 /**
6 创建局部内部类
7 */
8 class InnerClass{
9 public void execute(){
10 System.out.println("LocalInner Class”);
12 //局部内部类只能访问final类型的变量
13 System.out.println(a);
14 }
15 }
16 //只能在所在方法区域创建
17 new InnerClass().execute();
18 }
19 }
//在main方法中使用:
1 public static void main(String[] args) {
2 //外部不能直接创建局部内部类
3 LocalInner localInner = new LocalInner();
4 localInner.execute();
5 }
4、匿名内部类(anonymous inner classes):
匿名内部类没有类名,没有class关键字也没有extends和implements等关键字修饰。
匿名内部类会隐式地继承一个父类或实现一个接口。
相关使用例子:匿名内部类
1 public static void main(String[] args) {
2 AnonymousInnerClassTest test = new AnonymousInnerClassTest();
4 /**
5 * 创建匿名内部类
6 * 生成的类名:AnonymousInnerClassTest$1
7 */
8 test.print(new Date(){
9 //重写toString()方法
10 @Override
11 public String toString() {
12 return "Hello world.";
13 }
14 });
16 JButton button = new JButton();
18 /**
19 * 创建匿名内部类
20 * 该匿名内部类实现ActionListener接口
21 * 生成的类名:AnonymousInnerClassTest$1
22 */
23 button.addActionListener(new ActionListener(){
24 //实现接口中的方法
25 @Override
26 public void actionPerformed(ActionEvent e) {
27 System.out.println("使用匿名内部类实现ActionListener接口");
28 }
29 });
30 }
32 public void print(Date date){
33 System.out.println(date);
34 }