内部类知识总结3--匿名内部类

匿名类特点

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 和默认访问级别,而成员内部类可以处于publicprotected private 默认访问级别。如果一个内部类仅仅为特定的方法提供服务,那么可以把这个内部类定义在方法之类。

 2 直接访问外部类的成员

 3 回调外部类的方法

内部类的类文件:

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值