java 内部类
定义:将一个类的定义放在另一个类的定义内部,这就是内部类。
为什么要使用内部类?在《Thinking in java》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
一个简单的内部类:
1 /** 2 * 内部类 3 * 2016/5/5 4 **/ 5 package cn.Java_7; 6 7 public class InsideClass { 8 9 class Father{ 10 Father(){ 11 System.out.println("father"); 12 } 13 public void Fun(){ 14 System.out.println("nihao "); 15 } 16 } 17 18 public Father father(){ 19 return new Father(); 20 } 21 22 public static void main(String[] args) { 23 InsideClass in = new InsideClass(); 24 InsideClass.Father father = in.father(); 25 father.Fun(); 26 } 27 28 }
如果要在静态方法中创建内部类的对象就必须,像上面一样,写一个方法,方法返回类型就是这个对象的类型。
链接到外部类:
1 /** 2 * 内部类 3 * 2016/5/5 4 **/ 5 package cn.Java_7; 6 7 class GrandFather{ 8 GrandFather(){ 9 System.out.println("GrandFather~~~"); 10 } 11 public void Gfun(){ 12 System.out.println("GrandFather Gfun"); 13 } 14 } 15 16 public class InsideClass { 17 18 class Father extends GrandFather{ 19 Father(){ 20 System.out.println("father~~~"); 21 } 22 public void Fun(){ 23 super.Gfun(); 24 System.out.println("Father Fun"); 25 } 26 } 27 28 public Father father(){ 29 return new Father(); 30 } 31 32 public static void main(String[] args) { 33 InsideClass in = new InsideClass(); 34 InsideClass.Father father = in.father(); 35 father.Fun(); 36 } 37 38 }
上面代码的内部类继承的外部类,并且可以访问外部类的方法,而内部类只能被外围类所访问,这样提供能更好的封装。
使用内部类优势小结:
1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
3、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
4、内部类提供了更好的封装,除了该外围类,其他类都不能访问。
使用 .this .new
1 /** 2 * 内部类 3 * 2016/5/5 4 **/ 5 package cn.Java_7; 6 7 public class InsideClass { 8 9 class Father { 10 Father(){ 11 System.out.println("father~~~"); 12 } 13 public void Fun(){ 14 System.out.println("Father Fun"); 15 } 16 public InsideClass grandfather(){ 17 return InsideClass.this; 18 } 19 } 20 21 public Father father(){ 22 return new Father(); 23 } 24 25 public static void main(String[] args) { 26 InsideClass in = new InsideClass(); 27 InsideClass.Father father = in.father(); 28 father.Fun(); 29 } 30 31 }
内部类还有很多其他特性,在这里先总结到这里。