黑马程序员技术交流社区

标题: 关于内部类以及匿名内部类 [打印本页]

作者: 窗外的雪儿飞    时间: 2015-8-29 21:37
标题: 关于内部类以及匿名内部类
【总结】
1,内部类。
1.1 内部类的由来:因为访问的特点。一个类如果直接访问另一个类中的成员,建议写内部类。
1.2 内部类出现后访问特点:
  内部类可以直接访问外部类的成员,包括私有的。
  外部类要访问内部类需要创建内部类的对象。
1.3 内部类在成员位置可以给成员修饰符所修饰。★★★
  public : 格式 外部类名.内部类名  变量名 = new 外部类().new 内部类();
  static :
   情况一:访问静态内部类中的非静态成员。
    外部类名.内部类名  变量名 = new 外部类名.内部类名();
   情况二:访问静态内部类中的静态成员。
    外部类名.内部类名.静态成员;
  注意事项:
   1,非静态内部类中,不允许定义静态成员,只可以定被final修饰的static常量。
   2,外部类的静态方法要访问内部类,需要创建内部类的对象,一定要注意,该内部类必须被静态修饰。
    否则,只能通过外部类对象.内部类对象的方式访问。看以下代码演示。
class Outer
  {
   static class Inner1
   {
   }

   class Inner2
   {
   }

   public static void method()
   {
    //访问Inner1.
    new Inner1();

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

   }

  }
1.4 非静态内部类之所以可以直接访问外部类中的成员:原因是内部类持有了 外部类名.this
1.5 局部内部类。
  局部内部类一样可以直接访问我外部类中的成员。
  注意:局部内部类不能直接访问局部中的变量:局部变量生命周期太短,很有可能局部变量已消失,而内部类对象还在。
     局部内部类只能访问被final修饰的局部变量,因为是一个常量,值不变。
1.6 内部类是可以继承其他类和实现接口的。★★★★
  如果内部类不需要对外提供,可以通过其继承的父类或者实现的接口,这种公共的类型对外提供。
2,匿名内部类。
其实就是对1.6的简化书写。
原理:匿名内部列其实就是一个子类对象。
格式:new 父类or接口(){子类内容}
如果实在接收不了匿名内部类的格式,可以还原成内部类。
其实InnerClassDemo7.java涉及的练习以及面试题要动手做?并写出原因。
  通常匿名内部类中的方式不要过多(少于两个),以免降低阅读性。
3,异常(部分)
异常:java中运行时出现的问题。
问题有两种:★★★★
  异常:可以处理的。
  错误:不用处理的,为啥?因为是系统底层发生。必须修改代码。
异常的发生的底层过程。参阅 异常发生的过程.JPG
1,代码补足。
interface Inter
{
void show(int a,int b);
void func();
}
class Demo
{
public static void main(String[] args)
{
  //补足代码;调用两个函数,要求用匿名内部类
    Inter in = new Inter()
  {
   public void show(int a,int b)
   {
    System.out.println(a+b);
   }
   public void func(){}
  };
  in.show(3,4);
  in.func();
}
}
2,哪个答案是正确的,为什么?把每一个选项的正确错误的原因写上。
class Demo
{
public void func()
{
  //位置1;
  this.new Inner();
}
class Inner{}//内部类。
public static void main(String[] args)
{
  Demo d=new Demo();
  // 位置2
//  d.new Inner();
  new d.Inner();
new Demo.Inner()
}
}
A.在位置1写 new Inner();//可以的,外部类访问内部类需要创建对象。
B.在位置2写 new Inner();//错误。d.new Inner();
C.在位置2写 new d.Inner();//格式。 new new Demo().Inner();
D.在位置2写 new Demo.Inner();//不行,Inner必须是静态的。
3,补足代码。
interface Test
{
void func();
}
class Demo
{
public static void main(String[] args)
{
  //通过主函数调用show,补足代码;通过(匿名内部类)进行show方法参数传递。

  new Demo().show(new Test()
  {
   public void func(){}
  });
   }
void show(Test t)
{
  t.func();
}
}







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