黑马程序员技术交流社区

标题: 关于匿名内部类的使用,开发当中情况下,如何调...? [打印本页]

作者: 陈文杰    时间: 2013-11-17 00:55
标题: 关于匿名内部类的使用,开发当中情况下,如何调...?
最近看到安卓开发响应点击时,没看懂。新学员求指导

作者: 不抛弃不放弃    时间: 2013-11-17 01:00
内部类和匿名类及其使用
(1)内部类是指在一个外部类的内部再定义一个类。
①特点:
非静态成员内部类的对象总是与其外部类的对象相关联,没有外部类的对象就不能存在非静态成员类的对象;
非静态成员内部类中可以直接访问其外部类的所有成员(包括私有成员),除非被非静态成员类中
声明的同名成员隐藏;非静态成员内部类中不能包含static的成员。
②外部类与内部类的访问原则
A:在内部类中可以直接引用它的外部类的成员,包括静态成员,实例成员及私有成员。
           反之,在外部类中,通过一个内部类的对象引用内部类中的成员
B:非静态成员内部类中的this引用只能访问非静态成员类实例本身,要访问其外部类实例必须使用以下语法格式:<外部类类名>.this
③内部类中可随意使用外部类的成员方法和成员变量,包括被修饰为private的成员变量和方法。

内部类的实例一定要绑定在外部类的实例上。
内部类初始化方式与其他类初始化方式相同,都是使用new关键字。
④创建内部类对象
A:使用步骤:
step1 建立外部类对象
step2 根据外部类对象建立内部类对象
step3 访问内部类的方法
B:创建非静态成员内部类的对象要按照以下语法格式:
外部类类名.内部类类名 内部类引用=外部类对象引用.new 内部类构造方法()
⑤内部类的继承
在同一个类中的内部类的继承;
继承另一个外部类中的内部类:内部类的子类必须与被继承的内部类的外部类的实例关联。
内部类的子类不一定也是内部类。
⑥内部类的作用
内部类可以很好的实现隐藏
内部类拥有外围类的所有元素的访问权限
可以实现多重继承
可以避免修改接口而实现同一个类中两种同名方法的调用。
(2)成员内部类(定义在类内,方法外)作为外部类的一个成员存在,与外部类的属性、方法并列。
成员内部类的格式如下:
[修饰符]class 外部类名{
    [修饰符]class 内部类名{
         ... ...
     }
}
②静态内部类(定义在方法内)
A:静态内部类和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。
B:静态内部类具有以下特点:
不可以使用外部类的非静态成员或者其他内部类成员。
如果创建静态内部类的对象,不需要其外部类的对象。
一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。
C:静态成员类的类名表达有两种方式:
<外部类型名>.<静态成员类类名>
当外部类在同一包中时,可以导入静态成员类,直接使用类名
③局部内部类(定义在类内,方法外)
A:局部内部类是在一个类的方法中或任意的作用域中定义的一个内部类。
  B:特点:方法中的内部类,作用域仅限于该方法中。
局部内部类在块外是完全不能被访问的。局部类只能使用final或abstract关键字修饰,不能使用public或static修饰。
局部内部类可以访问局部变量,方法参数,外部类所有的成员,包括实例变量和静态变量,唯一的限制是局部变量和方法参数必须是声明为final的才能访问。
不能通过外部类名.内部类类名来用该内部类,只能在外部类中提供方法得到内部类的实例。
④匿名内部类(定义在方法内)没有名字的内部类
A:类的定义和创建是同时进行的,即类的定义实际上是写在new的代码中,而不拥有class关键字;不能有修饰符和构造方法。
B:匿名类构造格式如下:
new  父类无参构造函数(){
...//内部类体
};
C:匿名类的特点:
匿名类是一种特殊的局部类
匿名类通常作为抽象类或接口的实现类使用
匿名类不能定义自己的构造函数,只能使用父类或默认的构造函数
匿名类对象的创建的同时也提供了对接口或抽象类的实现,可以访问类的成员、覆盖它的方法等,如果实现了一个接口,它的主体必须实现接口的方法。
D:什么情况下需要使用匿名内部类?
只用到类的一个实例。而且要产生的新类需继承于一个已有的父类或实现一个接口。
类在定义后马上用到。  
类非常小(SUN推荐是在4行代码以下)  
给类命名并不会导致你的代码更容易被理解。
   匿名类尤其适合在Swing应用程序中快速创建事件处理程序。GUI等包含大量接口的程序中使用的比较多。
E:在使用匿名内部类时,要记住以下几个原则:
匿名内部类不能有构造方法。  
匿名内部类不能定义任何静态成员、方法和类。  
匿名内部类不能是public,protected,private,static。  
只能创建匿名内部类的一个实例。
一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。  
因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。


作者: 陈文杰    时间: 2013-11-17 12:28
谢谢学长的指导,从根本上理解,不用跟着视频中别人代码模块来写。{:soso_e183:}
作者: jayclf    时间: 2013-11-17 12:54
一楼讲得好,赞一个!




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