一个程序
class Data{
double data(int n){
return 0;
}
}
abstract class Sqrt{
 public abstract double sqrt(double x); 
}
class A{
void f(Data data){
double result=data.data(3);
System.out.println(result);
}
}
public class a910_5 {
public static void main(String[] args){
A a=new A();
a.f(new Data(){                            //看不懂a.f(new Data(){...}什么意思
double data(int n){
return n*n*n;
}
}
);
Sqrt ss=new Sqrt(){                        //怎么看不懂Sqrt ss=new Sqrt(){...}什么意思
public double sqrt(double x){
return Math.sqrt(x);
}
};
double m=ss.sqrt(144);
System.out.println(m);
}
}
哪位JAVA高手能帮我解释一下吗,查书也查不到

解决方案 »

  1.   

    //看不懂a.f(new Data(){...}什么意思 
    因为函数f接收的是一个Data对象,这里用了内部类的写法。//怎么看不懂Sqrt ss=new Sqrt(){...}什么意思 
    同样是内部类的写法。
      

  2.   

    a.f(new Data() :调用a对象的f函数,参数为新创建的一个Data对象..
    Sqrt ss=new Sqrt()  :定义一个Sqrt类变量,并将该变量指向新创建一个Sqrt类对象实例
      

  3.   

    都是匿名内部类.
    new Data(){                            //看不懂a.f(new Data(){...}什么意思 
    double data(int n){ 
    return n*n*n; 


    new Data(){...}就是创建一个继承自Data的内部类,它重写了data方法
      

  4.   

    匿名内部类,你可以看一下《Java编程思想第三版》,里面有详尽的介绍。这里我简单说明一下
    a.f(new Data(){...})这句代码就相当于下面的代码
    Data d=new Data();
    a.f(d);
    只不过你用的是匿名的只能用一次,你想以后接着再用这个对象就不像用d那么简单了
      

  5.   

    a.f(new Data(){                            //看不懂a.f(new Data(){...}什么意思 
    double data(int n){ 
    return n*n*n; 


    ); 
    个人感觉new Data()这个类的实例的时候,相当与继承了了Data这个类,所以这里重新实现了Data类中的data(int n)方法,所以这个实例执行的是重写的方法,而不是Data类中已经定义的data(int n)方法。Sqrt ss=new Sqrt(){ 相同!
      

  6.   

    一般都是写成
       Date date=new Date()
    {
       //方法 体  重写父类方法  或者重载
    }
      

  7.   

    我主要是想问a.f(new data(){})
    这个new data(){}后面紧跟个大括号,{}是我看不懂的地方
      

  8.   

    new Data(){                            //看不懂a.f(new Data(){...}什么意思
    double data(int n){
    return n*n*n;
    }
    } 这里是个匿名类,只能使用一次
    Sqrt ss=new Sqrt(){...}也是同理
      

  9.   

    new Data(){                            //看不懂a.f(new Data(){...}什么意思 
    double data(int n){ 
    return n*n*n; 

    } 这里是个匿名类,只能使用一次 {...}里面是对原有方法的重写
    Sqrt ss=new Sqrt(){...}也是同理
      

  10.   

    请看下面解释,相信你能明白
    class A{}//A是一个类
    interface B{
      abstract void g();
    }//B是一个接口,且包含一个抽象方法
    class C{
      public void f(A a){}
      public void h(B b){}
      public static void main(String args[]){
        C c=new C();
        c.f(new A(){});//这里的new A(){}就是一个类的定义
         c.h(new B(){
         public void g(){}
        }); //最后的;号代表此表达式结束,也就是説这个匿名内部类是在此表达式的内部        
      }
    }
    以下是楼上的一位朋友的解释,
    a.f(new Data(){...})这句代码就相当于下面的代码 
    Data d=new Data(); 
    我认为是不正确的,如果Data类是个抽象类或是一个接口呢,那么它们是不能被实例化的,只有它们的子类可以被实例化,
    那么Data d=new Data();就会产生编译时错误此匿名内部类应该是以下代码的简写
    public class D implements B{
      public void g(){}必需覆盖接口方法
    }
    所以刚才的代码
    c.h(new B(){
         public void g(){}
        }; 
    相当于
    D d=new D();
    c.h(d);
    或者直接用匿名类
    c.h(new D());