一: 内部类


    定义在类体部,方法体部,甚至比方法体更小的代码块内部的类(if 语句里面等)



        1.声明在类体部,方法体外,并且使用static修饰的内部类


        2.访问特点可以类比静态变量和静态方法


        3.脱离外部类的实例独立创建


            在外部类的外部构建内部类的实例


                new Outer.Inner();


            在外部类的内部构建内部类的实例


                new Inner();


        4.静态内部类体部可以直接访问外部类中所有的静态成员,包含私有

          


    

[java]  
   view plain 
    copy 
   
 
    
 
1. /**
2.  * @author gress
3.  *静态内部类
4.  */  
5. public class StaticInnerTest {  
6. public static void main(String[] args) {  
7.   
8. new StaticOuter.StaticInner();  
9.         si.test2();  
10. //StaticOuter.StaticInner.test();  
11. "si.b = "+si.b);  
12. "si.a = "+si.a);  
13. //  System.out.println("StaticOuter.b  = "+StaticOuter.b);  这里报错  
14.     }  
15.   
16. }  
17.   
18. class StaticOuter {  
19. private int a = 100;  
20. private static int b = 150;  
21. public static void test(){  
22. "Outer static test ...");  
23. }  
24. public  void test2(){  
25. "Outer instabce test ...");  
26. }     
27.   
28. static class StaticInner {  
29. public  int a = 200;  
30. static int b =300;  
31. public static void test(){  
32. "Inner static test ...");  
33.         }  
34. public  void test2(){  
35. "Inner instance test ...");  
36.             StaticOuter.test();  
37. new StaticOuter().test2();  
38. "StaticOuter.b  = "+StaticOuter.b);  
39.         }     
40.     }  
41. }




        1.没有使用static修饰的内部类。


        2.在成员内部类中不允许出现静态变量和静态方法的声明。


            static只能用在静态常量的声明上。


        3.成员内部类中可以访问外部类中所有的成员(变量,方法),包含私有成员,如果在内部类中定义有和外部类同名的实例变量,访问:


            OuterClass.this.outerMember;


        4.构建内部类的实例,要求必须外部类的实例先存在


            外部类的外部/外部类的静态方法:new Outer().new Inner();


            外部类的实例方法:


                new Inner();


                this.new Inner();



[java]  
   view plain 
    copy 
   
 
    
 
1. **  
2. @author gress  
3.  * 实例内部类  
4.  *  
5.  */  
6. class MemberOuter{  
7.       
8. private String s1 = "Outer InstanceMar";  
9. private String s2 = "OuterStatic s2";  
10. public void setS1(String s1) {  
11. this.s1 = s1;  
12. new MemberOuter().new MemberInner();  
13. this.new MemberInner();  //此时MemberOuter已经实例化完成,所以可以使用this  
14. new MemberInner().test2();  
15.     }  
16. public static void  test2 (){  
17. new MemberOuter().new MemberInner();  
18. /*this.new MemberInner();  
19.          * 此时MemberOuter没有实例化完成,所以不可以使用this
20.          * static 是在MemberOuter构造器前使用,所以此时this不能使用
21.          * 
22. */  
23.           
24.     }  
25.   
26.   
27. class MemberInner{  
28. "Inner  instanceMae  ";  
29. static final String s4 = "static final  MemberInner";  
30.               
31. void test2(){  
32. " s1 =" + s1);  
33. " Outter MemberOuter.this.s1 =" + MemberOuter.this.s1);  
34. "s2 = "+s2);  
35.                 }  
36.     }  
37.       
38. }  
39.   
40. public class MemberInnerTest {  
41.   
42. public static void main (String args []){  
43. /*  MemberOuter.MemberInner mm =  new MemberOuter().new MemberInner();
44.         mm.test2();*/  
45.           
46. new MemberOuter();  
47. "");  
48.           
49.           
50.     }  
51. }




        1.定义在方法体,甚至比方法体更小的代码块中


        2.类比局部变量。


        3.局部内部类是所有内部类中最少使用的一种形式。


        4.局部内部类可以访问的外部类的成员根据所在方法体不同。


            如果在静态方法中:


                可以访问外部类中所有静态成员,包含私有


            如果在实例方法中:


                可以访问外部类中所有的成员,包含私有。


          局部内部类可以访问所在方法中定义的局部变量,但是要求局部变量必须使用final修饰。


          

[java]  view plain  copy




1. **  
2. @author gress 局部内部类  
3.  *  
4.  */  
5. public class LocalInnerTest {  
6.   
7. private int a = 1;  
8. private static int b = 2;  
9.   
10. public void test() {  
11. final int c = 3;  
12. class LocalInner {  
13. public void add1() {  
14. "a= " + a);  
15. "b= " + b);  
16. "c= " + c);  
17.             }  
18.         }  
19. new LocalInner().add1();  
20.     }  
21.   
22. static public void test2() {  
23. final int d = 5;  
24. class LocalInner2 {  
25. public void add1() {  
26. // System.out.println("a= " + a);  
27. "b= " + b);  
28. "c= " + d);  
29.             }  
30.         }  
31. new LocalInner2().add1();  
32.     }  
33.   
34. public static void main(String args[]) {  
35.   
36. // LocalInnerTest() lc = new LocalInnerTest();  
37. new LocalInnerTest().test2();  
38. new LocalInnerTest().test();  
39.     }  
40. }

        1.没有名字的局部内部类。


        2.没有class,interface,implements,extends关键字


        3.没有构造器。


        4.一般隐式的继承某一个父类或者实现某一个接口


        5.吃货老师讲的一个很生动的例子


        /**


         * @author gress 匿名内部类,我只会使用一次的类


         * 假如我想吃一个泡面,但我不可能建一个厂,制造一个流水线,生产一包泡面之后就在也不去使用这个泡面厂了


         * 所以这里引申出匿名内部类 ,而我们建立的泡面厂就像这里构建的一个类Pencil 铅笔类一样


         */


    


[java]  view plain  copy



1. **  
2. @author gress 匿名内部类,我只会使用一次的类  
3.  *   
4.  * 就假如我想吃一个泡面,但我不可能建一个厂,制造一个流水线,生产一包泡面之后就在也不去使用这个泡面厂了  
5.  * 所以这里引申出匿名内部类 ,而我们建立的泡面厂就像这里构建的一个类Pencil 铅笔类一样  
6.  */  
7. interface Pen {  
8. public void write();  
9. }  
10.   
11. class  Pencil implements Pen {  
12. @Override  
13. public void write() {  
14. //铅笔 的工厂  
15.     }  
16. }  
17.   
18. class Person {  
19. public void user(Pen pen) {  
20.         pen.write();  
21.     }  
22. }  
23.   
24. public class AnyInnerTest {  
25. public static void main(String args[]) {  
26. new Person();  
27.           
28. new Pen() {  
29. @Override  
30. public void write() {  
31. "写子");  
32.             }  
33.         });  
34.     }  
35.   
36. }