安卓学习笔记1_内部类
最近开始学习安卓,所以把安卓学习过程中遇到的知识记录一下
笔记
我在button按钮的设置点击监听器这里,使用匿名内部类的方法创建了监听器实例,这个匿名内部类既是匿名内部类,又是局部内部类.
所以如果要把Edit editText = findViewById(R.id.edit_text)
放在内部类外面的话,有两种方式.
第一种就是放在onCreate()
方法中, 这时候需要给editText
对象增加final修饰符.
第二种是将editText
放在的声明放在成员变量的位置,那么内部类内部就可以直接调用(正式开发的时候采用第二种 ).
由于静态内部类,成员内部类,匿名内部类和局部内部类的概念有一些交集.
所以,打算乘此机会对其进行一下总结:
其一:为什么要使用内部类呢?
首先,一般使用最多的是成员内部类和静态内部类.一般这两个内部类是用来辅助外部类而使用的.
比如说外部类要新增功能最简单的方式就是实现一个接口.
但是仅仅是自己需要使用的时候,内部类也可以做到这些.,一般不需要做为接口给外部使用.这时候,直接写一个内部类就可以了.
比如,在安卓中有一个AlertDialog
类,他的作用是在当前界面弹出一个置顶于所有界面元素之上的对话框.
这个类的内部就有一个public static class Builder {}
的静态内部类.
该静态内部类的作用是: Creates a builder for an alert dialog
实际上由于AlertDialog的构造方法是被保护的,所以我们在不同包下,不能直接调用AlertDialog
的构造方法进行实例化.
所以我们通过其静态内部类的Builder
类辅助用来dialog对象的实例化.而Builder也可以对AlertDialog
类中的成员常量AlertController
的内部封装变量进行更改.
所以,这里的Builder
类就是起一个辅助外部类的作用.
具体为什么AlertDialog
要使用protected对其构造方法进行保护,我以后对源码进行解读之后.有必要在对AlertDialog
的源码进行分析.
下图是AlertDialog
类中的静态内部类Builder
其二:内/外部类的访问分析
1:成员内部类
成员内部类,就是在一个类的成员 变量/方法 的位置直接定义一个类.
他和普通类成员没有区别.
要注意的是成员内部类是绝对不能在定位为static的.如果定义了static,就变成了静态内部类了.
普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象;而静态内部类是没有这个引用的
与外部类的交流:
1:内部类访问外部类:可以直接访问外部类的所有成员
2:外部类访问内部类:需要先对内部类进行实例化才能访问.
2:静态内部类
当成员内部类加了static,就变成了静态内部类.静态内部类和外部类的关系不大.如果你不需要内部类对象与其外围类对象之间有联系,就可以使用静态内部类.
与外部类的交流:
1:内部类访问外部类:只能访问外部类静态成员.
2:外部类访问内部类:有两种情况
*访问内部类的静态成员,直接调用类名.成员名;
*访问问内部类的非静态成员,需要实例化之后才可以.
这里做为延伸,介绍一下静态内部类的类加载机制.
一般来说,一个类的静态成员都会随着类的加载而加载.但是静态内部类不同,他是不随着外部类的加载而加载的.
3:局部内部类
局部内部类,就是定义在方法中的内部类.一般用来实例化需要重写方法的类对象时使用.
一般使用较少.
1:由于他和局部变量是同一个级别,生命周期也和该方法中的局部变量生命周期类似.
2:局部内部类本身不能被访问限定符修饰(但是其内部成员可以被修饰).
3:局部内部类的实例化只能在其内部进行,不能在外部对其进行实例化.
与外部类的交流:
1:内部类访问外部类:可以访问所在方法的所有final常量,也可以访问外部类的所有成员.
2:外部类访问内部类:一般访问不了,但是好像用反射强行访问是可以的
4:匿名内部类
匿名内部类,一般用来创建一个实例.实例完一次就扔的时候,就可以使用匿名内部类了.
1:匿名内部类中不能有任何静态的成员(因为匿名内部类的使用一般是用来快速实例化的,所以他也就不是静态的,当然不能有静态成员).
2:匿名内部类不能被public,public,protected,private,static
修饰(显然啊,连类名都没有,直接实例化了)
3:因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
与外部类的交流:
1:内部类访问外部类:可以访问所在方法的所有final常量,也可以访问外部类的所有成员.
2:外部类访问内部类:一般访问不了,但是好像用反射强行访问是可以的