java 内部类详解(一)

2014-11-24 07:48:32 · 作者: · 浏览: 5
Java 内部类 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。
1、成员内部类: 即作为外部类的一个成员存在,与外部类的属性、方法并列。
注意:成员内部类中不能定义静态变量,但可以访问外部类的所有成员。 Java代码 收藏代码
  1. public class Outer{
  2. private static int i = 1;
  3. private int j=10;
  4. private int k=20;
  5. public static void outer_f1(){
  6. //do more something
  7. System.out.println("outer's outer_f1");
  8. }
  9. public void out_f2(){
  10. //do more something
  11. }
  12. //成员内部类
  13. class Inner{
  14. //static int inner_i =100; //内部类中不允许定义静态变量
  15. int j=100;//内部类中外部类的实例变量可以共存
  16. int inner_i=1;
  17. void inner_f1(){
  18. System.out.println(i);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
  19. System.out.println(j);//在内部类中访问内部类自己的变量直接用变量名
  20. System.out.println(this.j);//也可以在内部类中用"this.变量名"来访问内部类变量
  21. //访问外部类中与内部类同名的实例变量可用"外部类名.this.变量名"。
  22. System.out.println(k);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
  23. outer_f1(); //可以直接访问外部类的静态方法
  24. // outer_f2(); //compile error,访问外部类非静态方法,必须使用外部类的实例,如下一句
  25. Outer.this.out_f2();
  26. }
  27. }
  28. //外部类的非静态方法访问成员内部类
  29. public void outer_f3(){
  30. Inner inner = new Inner();
  31. inner.inner_f1();
  32. }
  33. //外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样
  34. public static void outer_f4(){
  35. //step1 建立外部类对象
  36. Outer out = new Outer();
  37. //***step2 根据外部类对象建立内部类对象***
  38. Inner inner=out.new Inner();
  39. //step3 访问内部类的方法
  40. inner.inner_f1();
  41. }
  42. public static void main(String[] args){
  43. outer_f4();
  44. }
  45. } 成员内部类的优点:
    ⑴ 内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
    ⑵ 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
    注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
    2、局部内部类: 即在方法中定义的内部类,与局部变量类似,在局部内部类前不加修饰符public或private,其范围为定义它的代码块。
    注意:局部内部类中不可定义静态变量,可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的。
    Java代码 收藏代码
    1. public class Outer {
    2. private int s = 100;
    3. private int out_i = 1;
    4. public void f(final int k) {
    5. final int s = 200;
    6. int i = 1;
    7. final int j = 10;
    8. class Inner { // 定义在方法内部
    9. int s = 300;// 可以定义与外部类同名的变量
    10. // static int m = 20;//不可以定义静态变量
    11. Inner(int k) {
    12. inner_f(k);
    13. }
    14. int inner_i = 100;
    15. void inner_f(int k) {
    16. System.out.println(out_i);// 如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
    17. System.out.println(k);// *****可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的*****
    18. // System.out.println(i); //compile error,i必须是final的
    19. System.out.println(s);// 如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
    20. System.out.println(this.s);// 用"this.变量名" 访问的也是内部类变量
    21. System.out.println(Outer.this.s);// 用外部"外部类类名.this.变量名"
    22. // 访问的是外部类变量
    23. }
    24. } //inner
    25. new Inner(k);
    26. }
    27. public static void main(String[] args) {
    28. // 访问局部内部类必须先有外部类对象
    29. Outer out = new Outer();
    30. out.f(3);
    31. }
    32. }
      注意:

      执行结果:
      1
      3
      300
      300
      100
      在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。通过内部类和接口达到一个强制的弱耦合,用局部内部类来实现接口,并在方法中返回接口类型,使局部内部类不可见,屏蔽实现类的可见性。

      3、静态内部类: 静态内部类定义在类中,任何方法外,用static定义。
      注意:静态内部类中可以定义静态或者非静态的成员 Java代码 收藏代码
      1. public class Outer {
      2. private static int i = 1;
      3. private int j = 10;
      4. public static void outer_f1() {
      5. }
      6. public void outer_f2() {
      7. }
      8. // 静态内部类可以用public,protected,private修饰
      9. // 静态内部类中可以定义静态或者非静态的成员
      10. static class Inner {
      11. static int inner_i = 100;
      12. int inner_j = 200;
      13. static void inner_f1() {
      14. System.out.println("Outer.i " + i);// 静态内部类只能访问外部类的静态成员
      15. outer_f1();// 包括静态变量和静态方法
      16. }
      17. void inner_f2() {
      18. // System.out.println("Outer.i"+j);// error 静态内部类不能访问外部类的非静态成员
      19. // outer_f2();//error 包括非静态变量和非静态方法
      20. }
      21. }
      22. public void outer_f3() {
      23. // 外部类访问内部类的静态成员:内部类.静态成员
      24. System.out.println(Inner.inner_i); //100
      25. Inner.inner_