A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 别想太多 中级黑马   /  2015-5-26 08:59  /  293 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. 成员内部类      成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
      要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。
      在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;
      而需要创建内部类对象,可以使用outer.inner  obj = outerobj.new inner();
  1. public class Outer {
  2.     public static void main(String[] args) {
  3.         Outer outer = new Outer();
  4.         Outer.Inner inner = outer.new Inner();
  5.         inner.print("Outer.new");

  6.         inner = outer.getInner();
  7.         inner.print("Outer.get");
  8.     }

  9.     // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时
  10.     public Inner getInner() {
  11.         return new Inner();
  12.     }

  13.     public class Inner {
  14.         public void print(String str) {
  15.             System.out.println(str);
  16.         }
  17.     }
  18. }
复制代码
2. 局部内部类      局部内部类,是指内部类定义在方法和作用域内。Thinking in Java给了这么两个例子:
定义在方法内:
  1. public class Parcel4 {
  2.     public Destination destination(String s) {
  3.         class PDestination implements Destination {
  4.             private String label;

  5.             private PDestination(String whereTo) {
  6.                 label = whereTo;
  7.             }

  8.             public String readLabel() {
  9.                 return label;
  10.             }
  11.         }
  12.         return new PDestination(s);
  13.     }

  14.     public static void main(String[] args) {
  15.         Parcel4 p = new Parcel4();
  16.         Destination d = p.destination("Tasmania");
  17.     }
  18. }
复制代码
3. 匿名内部类
  1. ((Button) findViewById(R.id.start)).setOnClickListener(new Button.OnClickListener() {
  2.     @Override
  3.     public void onClick(View v) {
  4.         new Thread() {

  5.             @Override
  6.             public void run() {
  7.                 // TODO Auto-generated method stub
  8.             }

  9.         }.start();
  10.     }
  11. });
复制代码
匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的,看下面例子:
  1. public class Outer {
  2.     public static void main(String[] args) {
  3.         Outer outer = new Outer();
  4.         Inner inner = outer.getInner("Inner", "gz");
  5.         System.out.println(inner.getName());
  6.     }

  7.     public Inner getInner(final String name, String city) {
  8.         return new Inner() {
  9.             private String nameStr = name;

  10.             public String getName() {
  11.                 return nameStr;
  12.             }
  13.         };
  14.     }
  15. }

  16. //注释后,编译时提示类Inner找不到
  17. /* interface Inner {
  18.     String getName();
  19. } */
复制代码
4.内部类的继承      内部类的继承,是指内部类被继承,普通类 extents 内部类。而这时候代码上要有点特别处理,具体看以下例子:
  1. public class InheritInner extends WithInner.Inner {

  2.     // InheritInner() 是不能通过编译的,一定要加上形参
  3.     InheritInner(WithInner wi) {
  4.         wi.super();
  5.     }

  6.     public static void main(String[] args) {
  7.         WithInner wi = new WithInner();
  8.         InheritInner obj = new InheritInner(wi);
  9.     }
  10. }

  11. class WithInner {
  12.     class Inner {

  13.     }
  14. }
复制代码






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马