匿名类特点

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 回调外部类的方法

内部类的类文件:

命名规则成员内部类:外部类名字$内部类名字

         局部内部类:外部类名字$数字$内部类名字

         匿名类:外部类名字$数字。