Java笔记(十六)……内部类
内部类概述
内部类是将一个类定义在另一个类里面,对里面那个类就成为内部类(内部类,嵌套类)。
当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容
访问特点
内部类可以直接访问外部类的所有成员,包括私有,之所以可以直接访问,是因为内部类持有外部类对象的引用,Outer.this
而外部类想要访问内部类必须创建对象或者使用类名引用
其他类访问内部类格式
Outer.Inner in = new Outer().new Inner();
内部类的位置
内部类定义在成员位置上
与其他成员一样,可以被static,private等修饰
静态内部类
静态内部类只能直接访问外部类的静态成员
- 外部其他类访问静态内部类的非静态成员
- new Outer.Inner().function();
- 外部其他类访问静态内部类的静态成员
- Outer.Inner.function();
注:
- 当内部类定义了静态成员时,该内部类必须是静态的
- 当外部类的静态方法访问内部类时,内部类必须是静态的
内部类定义在局部位置上
不可以被成员修饰符修饰
可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的变量
匿名内部类
匿名内部类其实就是内部类的简写形式
如果该内部类只需调用一次,那么我们不必定义在外部类中,可以直接使用匿名内部类,方便快捷
这是我以前写的一段总结
1:
2:
3: //匿名对象要实例化的接口
4: interface Head
5: {
6: void think();
7: }
8: //匿名对象要实例化的类
9: class Person
10: {
11: private String name;
12: private int age;
13:
14: Person(String name,int age)
15: {
16: this.name = name;
17: this.age = age;
18: }
19:
20: public String toString()
21: {
22: return name+"("+age+")";
23: }
24:
25: public void show()
26: {
27: System.out.println(toString());
28: }
29:
30:
31: /*private class Person_head implements head
32: {
33: void think()
34: {
35: System.out.println("Person thinking...");
36: }
37: }*/
38:
39: public void function()
40: {
41: //此处为匿名内部类,他结合了创建类和创建对象于一体
42: //既创建了一个新的Education的子类,又new了一个这个子类的对象,而且这个对象是匿名的
43: new Head()
44: {
45: public void think()
46: {
47: System.out.println(Person.this.toString()+" thinking...");
48: }
49: }.think();
50:
51: //此处为正常的内部类使用方法,就是被注释掉的代码部分
52: //所以匿名内部类代码简洁很多,用起来很方便
53: //Person_head ph = new Person_head();
54: //ph.think();
55:
56:
57: //注:匿名内部类的使用前提:必须是继承一个类或者实现接口,
58: // 因为创建的部分要由父类或者接口的名字来完成
59: // 匿名内部类要实现的方法最好不要超过3个,不然会很麻烦
60: }
61: }
62: class AnonymousDemo
63: {
64: public static void main(String args[])
65: {
66: AnonymousClassMethod_1();
67: AnonymousClassMethod_2();
68: }
69:
70: //这应该是匿名对象的最初定义,即对象没有一个“名字”
71: public static void AnonymousClassMethod_1()
72: {
73: //此处是正常创建对象的方法,对象有一个对应的引用p,所以可以多次调用p
74: Person p = new Person("Sunny",2);
75: p.show();
76: p.show();
77: //此处是匿名对象,新建的对象没有与其对应的引用来接受他,所以只能调用一次
78: new Person("Sunny",2).show();
79:
80: //注:一般对象的方法只调用一次时,可以使用匿名对象,也可将匿名对象作为参数传递给函数
81: }
82: public static void AnonymousClassMethod_2()
83: {
84: //用一个Person类的匿名对象调用function
85: //此处使用了匿名内部类,详见Person类中的function实现方法
86: new Person("Sunny",2).function();
87: }
88:
89: }