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 }

 

 

内部类还有很多其他特性,在这里先总结到这里。

posted on 2016-05-05 21:45  snail-lb  阅读(144)  评论(0编辑  收藏  举报