笔者今天又写了个程序,关于匿名内部类的,红色部分是不利用匿名类的话,实现接口所写的代码;而当我们使用了匿名类,我想问的是,每声明一个匿名类只能调用一次方法吗?我想调用print1()和print2()两个方法,难道要这样重复声明code1和code2两个匿名类?有没有一种方法只声明一次匿名类,可以多次调用它所实现接口的方法?public class 匿名内部类 { public static void main(String[] args) {
/* K k1=new H();
System.out.println(k1.print1());
System.out.println(k1.print2());
*/
code1. new K(){
public int print1(){
System.out.println("匿名内部类的整型方法");
return 66;

public double print2(){
//System.out.println("匿名内部类的双精度浮点型方法");
return 0;
}
}.print1();
code2. new K(){
public int print1(){
return 0;
}
public double print2(){
System.out.println("匿名内部类的双精度浮点型方法");
return 66.666666;
}
}.print2();

}}interface K{
public int print1();
public double print2();
}//正常情况是用别的类去实现接口,也可以像上面那样弄成匿名类,更方便!
/*class H implements K{
public int a;
public double b;

public int print1(){
System.out.println("匿名内部类的整型方法");
return 66;
}
public double print2(){
System.out.println("匿名内部类的双精度浮点型方法");
return 66.666666;
}
}*/

解决方案 »

  1.   

    难道要这样重复声明code1和code2两个匿名类?
    --是的
    有没有一种方法只声明一次匿名类,可以多次调用它所实现接口的方法
    --没有依lz的要求其实就没必要用到匿名类,lz说到的都是匿名类的两个痛处。当然,逻辑上,lz本来可以将print1和print2分别创建到两个匿名类中。不过这不影响对lz问题的答案。
      

  2.   

    要是java支持Closure问题就容易了。用静态内部类或者有名字的内部类吧?
      

  3.   


    public class code1
    { public static void main(String[] args)
    {
    K k = new K()
    {
    public int print1()
    {
    System.out.println("匿名内部类的整型方法");
    return 66;
    } public double print2()
    {
    // System.out.println("匿名内部类的双精度浮点型方法");
    return 0;
    }
    };
    k.print1();
    k.print2(); }}interface K
    {
    public int print1(); public double print2();
    }
      

  4.   

    其实匿名内部类好处还是很多的,起码不用再new子类或者实现类了,想什么时候用就什么时候new一个父类或者接口的继承类或者实现类,用完即销毁。本例如果实在不行,就给它们起个共同的名字,然后每次调用即可。
    K k=new K(){
    public int print1(){
    System.out.println("匿名内部类的整型方法");
    return 66;
    }  
    public double print2(){
    //System.out.println("匿名内部类的双精度浮点型方法");
    return 0;
    }
    };
    k.print1();
    k.print2();
      

  5.   

    其实匿名内部类好处还是很多的,起码不用再new子类或者实现类了,想什么时候用就什么时候new一个父类或者接口的继承类或者实现类,用完即销毁。本例如果实在不行,就给它们起个共同的名字,然后每次调用即可。
    K k=new K(){
    public int print1(){
    System.out.println("匿名内部类的整型方法");
    return 66;
    }  
    public double print2(){
    //System.out.println("匿名内部类的双精度浮点型方法");
    return 0;
    }
    };
    k.print1();
    k.print2();
      

  6.   

    3楼是匿名类吧。。是实现了K接口的匿名类然后直接可以透过接口K用来调用匿名类的方法。这个类本身没有名字啊我是初学者,刚看完Thinking in java 的匿名类这章从里面的例子看。。这个貌似是匿名类很普遍的用法当然也不确定
      

  7.   

    我觉得是匿名内部类,像Thread t=new Thread(){...}这种形式的,个人觉得还有多态的存在。初学java,请大神指正
      

  8.   

    “这个类本身没有名字啊”
    但是这句
    K k = new K()
    中的类本身就是有名字的,就是K k 里的大写K匿名内部类的"类本身没有名字"这句可能说得就有些朦胧,其实说白了匿名类就是都用构造器
    return new Constructor(){}
    创建其实例的且因此只能创建一次。注意这里的 Constructor 不是类名而是构造器的名字,只不过Java/C++里它们名字一样而已。好处如同9楼讲得一样,匿名类可以省去声明子类或者实现接口的那些代码,使代码逻辑更清晰。
    但凡是出现
    A a = new A(){...};
    如果出现在类内部只能叫做内部类不算匿名内部类。
    因为已经出现了类名Class,自然也出现了类的实例,类的方法可以随着实例随意调用。
    说白了这个在类的内部定义个内部类,然后再用构造器创建实例
    A a = new A();
    Class A{
    ...

    没啥区别,只是代码风格不同罢了。
      

  9.   

    也许枚举可以做到一些lz想要的效果,例如如下的调用:
    A.B.getC().D.E.getF();