------- android培训、java培训、期待与您交流! ----------
在Java中,可以把一个类的定义放到另一个类中,--内部类。 第一个例子:
1 public interface Contents
2 {
3 int value();
4 }
5 public class Parcel7b
6 {
7 class MyContents implements Contents
8 {
9 private int i = 11;
10
11 public int value()
12 {
13 return i;
14 }
15 }
16
17 public Contents contents()
18 {
19 return new MyContents();
20 }
21
22 public static void main(String[] args)
23 {
24 Parcel7b p = new Parcel7b();
25 Contents c = p.contents();
26 Contents c1 = p.new MyContents();
27 }
28 }
当把内部类向上转型为基类,尤其转换成接口时,内部类就有啦用武之地。
在这个例子中MyContents被定义在Parcel7b的内部,并且实现啦Contents接口;
在main函数中直接通过接口Contents c来操作,对于实现就一点也不知道了,这很好的实现啦封装性, 同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法, 那就是利用其外部类的方法创建并返回。上例中的contents()方法就是这么做的。
还有想main方法中的:
Parcel7b p = new Parcel7b();
Contents c1 = p.new MyContents();
注意:在创建非静态内部类对象时,一定要先创建起相应的外部类对象。 这是因为非静态的内部类都有指向其外部类的引用。 在看一个例子:
1 public interface Contents
2 {
3 int value();
4 }
5 public class Parcel7b
6 {
7 private int i = 12;
8 public int j = 9;
9 class MyContents implements Contents
10 {
11 private int i = 11;
12
13 public int value()
14 {
15 return i + j + Parcel7b.this.i;
16 }
17 }
18
19 public Contents contents()
20 {
21 return new MyContents();
22 }
23
24 public static void main(String[] args)
25 {
26 Parcel7b p = new Parcel7b();
27 Contents c = p.contents();
28 Contents c1 = p.new MyContents();
29 }
30 }
在这里我们给Parcel7b类增加了一个private成员变量i,和public的成员变量j; 在内部类MyContents的方法value()计算价值时把它加上。 我们发现,value()可以访问i和j,这也是内部类的第二个好处: 一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量! 访问私有变量是(Parcel7b.this.i)这种方式。
在方法和作用域内的内部类---局部内部类
1 public interface Contents
2 {
3 int value();
4 }
5 public class Parcel7b
6 {
7 private int i = 12;
8 public int j = 9;
9
10 public Contents contents()
11 {
12
13 class MyContents implements Contents
14 {
15 private int i = 11;
16
17 public int value()
18 {
19 return i + j + Parcel7b.this.i;
20 }
21 }
22
23 return new MyContents();
24 }
25
26 public static void main(String[] args)
27 {
28 Parcel7b p = new Parcel7b();
29 Contents c = p.contents();
30 Contents c1 = p.new MyContents();
31 }
32 }
在contents方法中定义的MyContents 类,其作用域在这个方法内部,通过Contents接口访问。
匿名内部类 java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样, 当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的: new interfacename(){......}; 或 new superclassname(){......};
静态内部类 和普通的类一样,内部类也可以有静态的。不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。 除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。 不过静态内部类中却可以拥有这一切。