黑马程序员技术交流社区

标题: 内部类和匿名内部类 [打印本页]

作者: xiaoya0o0o    时间: 2015-9-17 22:04
标题: 内部类和匿名内部类
  1. 1,内部类。
  2.         1.1 内部类的由来:因为访问的特点。一个类如果直接访问另一个类中的成员,建议写内部类。
  3.         1.2 内部类出现后访问特点:
  4.                 内部类可以直接访问外部类的成员,包括私有的。
  5.                 外部类要访问内部类需要创建内部类的对象。
  6.         1.3 内部类在成员位置可以给成员修饰符所修饰。★★★
  7.                 public : 格式 外部类名.内部类名  变量名 = new 外部类().new 内部类();
  8.                 static :
  9.                         情况一:访问静态内部类中的非静态成员。
  10.                                 外部类名.内部类名  变量名 = new 外部类名.内部类名();
  11.                         情况二:访问静态内部类中的静态成员。
  12.                                 外部类名.内部类名.静态成员;
  13.                 注意事项:
  14.                         1,非静态内部类中,不允许定义静态成员,只可以定被final修饰的static常量。
  15.                         2,外部类的静态方法要访问内部类,需要创建内部类的对象,一定要注意,该内部类必须被静态修饰。
  16.                                 否则,只能通过外部类对象.内部类对象的方式访问。看以下代码演示。

  17.                 class Outer
  18.                 {
  19.                         static class Inner1
  20.                         {
  21.                         }

  22.                         class Inner2
  23.                         {
  24.                         }

  25.                         public static void method()
  26.                         {
  27.                                 //访问Inner1.
  28.                                 new Inner1();

  29.                                 //访问Inner2非静态。
  30.                                 new Outer().new Inner2();

  31.                         }

  32.                 }

  33.        
  34.         1.4 非静态内部类之所以可以直接访问外部类中的成员:原因是内部类持有了 外部类名.this
  35.         1.5 局部内部类。
  36.                 局部内部类一样可以直接访问我外部类中的成员。
  37.                 注意:局部内部类不能直接访问局部中的变量:局部变量生命周期太短,很有可能局部变量已消失,而内部类对象还在。
  38.                           局部内部类只能访问被final修饰的局部变量,因为是一个常量,值不变。
  39.         1.6 内部类是可以继承其他类和实现接口的。★★★★
  40.                 如果内部类不需要对外提供,可以通过其继承的父类或者实现的接口,这种公共的类型对外提供。

  41. 2,匿名内部类。
  42.         其实就是对1.6的简化书写。
  43.         原理:匿名内部列其实就是一个子类对象。
  44.         格式:new 父类or接口(){子类内容}

  45. //匿名内部类练习。
  46. interface Inter
  47. {
  48.         public void show();
  49. }
  50. class Outer
  51. {
  52.         //代码补足。要求使用匿名内部类。
  53.         public static Inter method()
  54.         {
  55.                 //既然在Oute类中使用到了Inter的对象。可以使用内部类来完成。
  56.                 //需要子类型,只要简化格式即可,因为接口中就只有一个方法。
  57.                 return new Inter()
  58.                 {
  59.                         public void show()
  60.                         {
  61.                                 //code..;
  62.                         }
  63.                 };
  64. //                return new Inner();
  65.         }
  66.        
  67.         /*
  68. //        还原成内部类。  当静态方法访问内部类时,内部类必须是静态的。
  69.         static class Inner implements Inter
  70.         {
  71.                 public void show(){}
  72.         }
  73.         */
  74. }
  75. //Outer$Inner.class 成员内部类Inner
  76. //Outer$1Inner.class 局部内部类名称为Inner
  77. //Outer$2.class//匿名内部类。



  78. //面试题。
  79. class Outer2
  80. {
  81.         public void method()
  82.         {
  83.                 //以下两个对象有区别吗?
  84.                 new Object()
  85.                 {
  86.                         public void show(){}
  87.                 }.show();//这个可以编译通过。

  88.                 Object obj = new Object()
  89.                 {
  90.                         public void show(){}
  91.                 };
  92. //                obj.show();//编译失败。为啥呢?因为匿名内部类是子类对象,当Object obj指向时,就被提升了Object。而Object类中没有定义show方法,编译失败。

  93.         }

  94. //        class Inner extends Object
  95. //        {
  96. //                public void show(){}
  97. //        }
  98. }


  99. class InnerClassDemo7
  100. {
  101.         public static void main(String[] args)
  102.         {
  103.                 Outer.method().show();
  104.                 /*
  105.                 Outer.method():Outer类中有一个method的方法。这个方式静态的。
  106.                 Outer.method.show():能调用show()的必然是对象,说明method方法运算完应该返回一个对象。而且能调用Inter中的show方法,说明这个对象的类型是Inter。
  107.                
  108.                 */

  109.                 Inter in = Outer.method();new InterImpl();
  110.                 in.show();
  111.         }
  112. }

复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2