注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

慵懒的乌龟

——若有,且珍惜~

 
 
 

日志

 
 

内部类之匿名内部类【转】  

2011-01-01 10:57:12|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

匿名内部类必须extends类或implements接口,否则编译器不认识.它是没有类名的,在定义时显示的是它所继承的父类或  接口的名字.

一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。

例:

public class Parce16{

    public Contents cont(){

         return new Contents(){                  //匿名内部类.

             private int i = 11;

             public int value(){return i;}

         };                                                    //这里有个分号

    }

}

在匿名内部类末尾的分号,并不是用来标记内部类的结束,实际上,它标记的是表达式的结束,只不过这个表达式正巧包含了匿名类.在匿名类中不可能有命名构造器(因为它根本没有名字!),但通过实例初始化,就能够达到为匿名内部类创建一个构造器的效果.

例:

dest(final String dest,final float price){

    return new Destination(){

         private int cost;

         {                                                            //这里是一对独立的大括号表示实例初始化

             cost = Math.round(price);

             if(cost>100) System.out.println("Over budget!");

         }

         private String label = dest;

         public String readLabel(){return label;}

    };

}

对于匿名类而言,实例初始化的实际效果就是构造器.当然它受到了限制---你不能重载实例初始化方法,所以你仅有一个这样的构造器.

因其为局部内部类,那么局部内部类的所有限制都对其生效------(参看:内部类之局部变量)

当需要多个对象时使用局部内部类方可行,因为局部内部类有构造方法,可产生多个对象。匿名内部类中不能定义构造方法,它只有一个实例.

测试代码


package test;   
  
/**   
 * 内部类之匿名内部类实例演示   
 *    
 * @author fhd001   
 */   
public class InnerClassA {   
  
    private String str1 = "abc";   
    private int n = 35;   
    private static String str2 = "MMM";   
  
    public void show() {   
  
        final int K = 54;   
        InnerOne one = new InnerOne() {   
            int n;   
            {//实例初始化   
                n = 60;   
                System.out.println("这里是用一对大括号进行实例初始化");   
            }   
            // static String s = "name";内部类中不能定义static变量.   
            public void aaa() {   
                System.out.println("局部常量K的值为:  " + K);   
                System.out.println("外围类成员变量str1的值:  " + str1);   
                System.out.println("外围类成员变量n的值:  " + InnerClassA.this.n);   
                System.out.println("外围类成员变量str2的值:  " + str2);   
                System.out.println("内部类成员变量n的值:  " + n);   
            }   
        };   
        one.aaa();   
    }   
  
    public static void main(String[] args) {   
  
        InnerClassA a = new InnerClassA();   
        a.show();   
    }   
}   
  
// 匿名内部类要实现的接口   
interface InnerOne {   
    public void aaa();   
}  

package test;/** * 内部类之匿名内部类实例演示 * * @author fhd001 */public class InnerClassA { private String str1 = "abc"; private int n = 35; private static String str2 = "MMM"; public void show() { final int K = 54; InnerOne one = new InnerOne() { int n; {//实例初始化 n = 60; System.out.println("这里是用一对大括号进行实例初始化"); } // static String s = "name";内部类中不能定义static变量. public void aaa() { System.out.println("局部常量K的值为: " + K); System.out.println("外围类成员变量str1的值: " + str1); System.out.println("外围类成员变量n的值: " + InnerClassA.this.n); System.out.println("外围类成员变量str2的值: " + str2); System.out.println("内部类成员变量n的值: " + n); } }; one.aaa(); } public static void main(String[] args) { InnerClassA a = new InnerClassA(); a.show(); }}// 匿名内部类要实现的接口interface InnerOne { public void aaa();}

 

结果代码


这里是用一对大括号进行实例初始化   
局部常量K的值为:  54  
外围类成员变量str1的值:  abc   
外围类成员变量n的值:  35  
外围类成员变量str2的值:  MMM   
内部类成员变量n的值:  60
  评论这张
 
阅读(317)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017