匿名类特点
1 匿名类本身没有构造方法,但是会调用父类的构造方法。
2 匿名类尽管没有构造方法,但是可以在匿名类中提供一段实例初始化代码。Java虚拟机会在调用了父类的构造方法后,执行这段代码。实例化代码和构造方法有同样的效果,前者允许被重载,匿名类实例只能有一种初始化方式。
publicclass A {
A(int v) {
System.out.println("参数构造函数");
}
A()
{
System.out.println("默认构造函数");
}
void method(){System.out.println("mehtod from A");}
publicstaticvoid main(String[] args) {
new A().method();
A a =new A() //匿名类
{
void method()
{
System.out.println("from 匿名类");
}
};
a.method();
System.out.println("===================================");
int v=3;
A aa=new A(v) //匿名内部类调用父类的构造方法
{
void method()
{
System.out.println("from 匿名类");
}
};
aa.method();
System.out.println("*******************************");
finalint vv=3;//必须定义为final
A aaa=new A(v)
{
{//实例化初始代码
};
void method()
{
System.out.println("from 匿名类"+vv);
}
};
aaa.method();
}
}
3 在声明成员变量时定义匿名类
Abstract class A
{
A a = new A()
{
Void mehtod(){//代码}
}
Abstract void method();
}
4 匿名类还可以实现接口
Thread t = new Thread(new Runnable()
{
Public void run(){//代码实现}
}
);
5 匿名内部类和局部内部类一样,可以访问外部类的所有成员。如果一个内部类中位于一个方法中还能访问所在方法的final类型的变量和参数。
6 局部内部类的名字在方法是不可见的,因此和匿名类一样,能够起到封装类型名字的作用。局部内部和匿名内部类的区别:
1 匿名内部类的程序代码比较简短
2 一个局部类可以有多个重载的构造方法,并且客户类可以多次创建局部类实例,而匿名类没有重载的构造的构造方法并且只能创建一次实例。
内部类中的接口和接口中的内部类:
publicclass Outer {
//定义接口
publicstaticinterface Tool{
publicint add(int a,int b);
}
//匿名内部类
private Tool tool =new Tool()
{
publicint add(int a,int b)
{
return a+b;
}
};
publicvoid add(int a,int b)
{
this.tool.add(a, b);
}
publicvoid setTool(Tool tool)
{
this.tool=tool;
}
/**
*@paramargs
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
}
}
//实现类中的内部接口。
class MyTool implements Outer.Tool
{
publicint add(int a, int b) {
System.out.println(a+b);
return a+b;
}
}publicinterface InterfaceA {
//在接口中定义静态内部类此时静态内部类位于接口的命名空间中
staticclass B {
};
//class F{}
publicvoid method(B b);
}
class C implements InterfaceA {
//因为C类实现InterfaceA 类B对于C可见
B b = new B();
publicvoid method(B b) {
}
}
class D {
//但是在类D中必须是下面这种新式访问。
InterfaceA.B a = new InterfaceA.B();
// B b =new B();//编译错误
}
内部类的用途
1 封装类型
顶层类只能处于public 和默认访问级别,而成员内部类可以处于public,protected private 默认访问级别。如果一个内部类仅仅为特定的方法提供服务,那么可以把这个内部类定义在方法之类。
2 直接访问外部类的成员
3 回调外部类的方法
内部类的类文件:
命名规则成员内部类:外部类名字$内部类名字
局部内部类:外部类名字$数字$内部类名字
匿名类:外部类名字$数字。