何为内部类
内部类是指 在一个类中在定义一个类
如:
1.成员内部类
public class F {
private int a;
public void fun(){
//TODO
}
public class M{
private int a;
public void fun(){
//TODO
}
}
}
2.局部内部类
public class F {
private int a;
public void fun(){
//TODO
class M{
private int a;
public void fun(){
//TODO
}
}
M m = new M();
m.fun();
}
}
值得注意的是:
1 . 无论是成员内部类还是局部内部类,内部类中定义的方法名和变量名可以和外部类相同。这是因为 当程序正确编译后,会生成两个class文件,即:F.class和F$M.class,且这两个class文件是两个不同的文件,故可以重名
2 . 上述内部类实例的存在必须依赖于父类的实例,
即:在外接使用内部类时,必须先new 一个F的实例,然后在调用F.new M()生成M的实例对象3 . 若内部类是static修饰过的,即静态内部类,这直接new一个静态内部类对象即可,注意要导入正确的包,它位于父类下。
4. 静态内部类参数必须用final修饰的原因:
静态内部类不依赖父类的实例的存在而存在
我们知道静态方法、静态成员变量随着类的加载而产生,不依赖与任何对象的存在
静态内部类解除了与外部类的关联,不持有外部类的引用
Java 对象的初始化顺序:
- 静态对象-非静态对象-构造器
其中静态对象包括:静态块,静态方法,静态属性- 对于继承父类的对象的初始化顺序:父类静态对象-子类静态对象-父类构造方法-子类构造方法
说明:在静态对象中初始话顺序实际上是按照声明的顺序执行的。
3.匿名内部类
在Android开发中常用到如:
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO
}
});
其中的new Button.onclickListener(){}即为匿名内部类的实例对象类
匿名内部类要求:
1. 匿名内部类没有名字,因此只能使用一次,下次再使用重新创建对象。
2. 匿名内部类的适用情形:某个类不是经常使用,如只使用一次,使用完后不保存该实例的对象,为了便于代码的编写常采用匿名内部类
3. 使用匿名内部类的前提条件:必须继承一个父类或实现一个接口
其他说明:
无论是匿名内部类、接口或者抽象类,都不能实例化
但我们常用到的new 一个匿名内部类、接口或者抽象类实际上是执行3步的合并,即:
a.先定义一个子类,让该子类继承上述接口或实现上述抽象类;
b.然后new一个该子类的对象;
c.将该子类的一个引用赋值给接口或者抽象类变量(它是依据java多态特性:父类指向子类的引用)。
上述说明事例代码:
1. new 一个接口
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
- 实际上的执行步骤为:
a.
class MyRunnable implements Runnable{
@Override
public void run() {
}
}
b.
MyRunnable myRunnable = new MyRunnable();
c.
Runnable runnable = myRunnable;