Java笔记(十六)……内部类

内部类概述

内部类是将一个类定义在另一个类里面,对里面那个类就成为内部类(内部类,嵌套类)。

当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容

访问特点

内部类可以直接访问外部类的所有成员,包括私有,之所以可以直接访问,是因为内部类持有外部类对象的引用,Outer.this

而外部类想要访问内部类必须创建对象或者使用类名引用

其他类访问内部类格式

Outer.Inner in = new Outer().new Inner();

内部类的位置

内部类定义在成员位置上

与其他成员一样,可以被static,private等修饰

静态内部类

静态内部类只能直接访问外部类的静态成员

  • 外部其他类访问静态内部类的非静态成员
    • new Outer.Inner().function();
  • 外部其他类访问静态内部类的静态成员
    • Outer.Inner.function();

注:

  • 当内部类定义了静态成员时,该内部类必须是静态的
  • 当外部类的静态方法访问内部类时,内部类必须是静态的

内部类定义在局部位置上

不可以被成员修饰符修饰

可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的变量

匿名内部类

匿名内部类其实就是内部类的简写形式

如果该内部类只需调用一次,那么我们不必定义在外部类中,可以直接使用匿名内部类,方便快捷

这是我以前写的一段总结

   1:  
   2:  
   3: //匿名对象要实例化的接口
   4: interface Head
   5: {
   6:         void think();
   7: }
   8: //匿名对象要实例化的类
   9: class Person
  10: {
  11:         private String name;
  12:         private int age;
  13:  
  14:         Person(String name,int age)
  15:         {
  16:                 this.name = name;
  17:                 this.age = age;
  18:         }
  19:  
  20:         public String toString()
  21:         {
  22:                 return name+"("+age+")";
  23:         }
  24:  
  25:         public void show()
  26:         {
  27:                 System.out.println(toString());
  28:         }
  29:  
  30:         
  31:         /*private class Person_head implements head
  32:         {
  33:                 void think()
  34:                 {
  35:                         System.out.println("Person thinking...");
  36:                 }
  37:         }*/
  38:  
  39:         public void function()
  40:         {
  41:                 //此处为匿名内部类,他结合了创建类和创建对象于一体
  42:                 //既创建了一个新的Education的子类,又new了一个这个子类的对象,而且这个对象是匿名的
  43:                 new Head()
  44:                 {
  45:                         public void think()
  46:                         {
  47:                                 System.out.println(Person.this.toString()+" thinking...");
  48:                         }
  49:                 }.think();
  50:  
  51:                 //此处为正常的内部类使用方法,就是被注释掉的代码部分
  52:                 //所以匿名内部类代码简洁很多,用起来很方便
  53:                 //Person_head ph = new Person_head();
  54:                 //ph.think();
  55:  
  56:  
  57:                 //注:匿名内部类的使用前提:必须是继承一个类或者实现接口,
  58:                 //    因为创建的部分要由父类或者接口的名字来完成
  59:                 //    匿名内部类要实现的方法最好不要超过3个,不然会很麻烦
  60:         }
  61: }
  62: class AnonymousDemo
  63: {
  64:         public static void main(String args[])
  65:         {
  66:                 AnonymousClassMethod_1();
  67:                 AnonymousClassMethod_2();
  68:         }
  69:  
  70:         //这应该是匿名对象的最初定义,即对象没有一个“名字”
  71:         public static void AnonymousClassMethod_1()
  72:         {
  73:                 //此处是正常创建对象的方法,对象有一个对应的引用p,所以可以多次调用p
  74:                 Person p = new Person("Sunny",2);
  75:                 p.show();
  76:                 p.show();
  77:                 //此处是匿名对象,新建的对象没有与其对应的引用来接受他,所以只能调用一次
  78:                 new Person("Sunny",2).show();
  79:  
  80:                 //注:一般对象的方法只调用一次时,可以使用匿名对象,也可将匿名对象作为参数传递给函数
  81:         }
  82:         public static void AnonymousClassMethod_2()
  83:         {
  84:                 //用一个Person类的匿名对象调用function
  85:                 //此处使用了匿名内部类,详见Person类中的function实现方法
  86:                 new Person("Sunny",2).function();
  87:         }
  88:  
  89: }
posted @ 2013-10-18 14:22  ShawnWithSmallEyes  阅读(405)  评论(0编辑  收藏  举报