在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(){......};
静态内部类 和普通的类一样,内部类也可以有静态的。不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。 除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。 不过静态内部类中却可以拥有这一切。
浙公网安备 33010602011771号