一个程序
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高手能帮我解释一下吗,查书也查不到
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高手能帮我解释一下吗,查书也查不到
解决方案 »
- 求过来人推荐一个你们认为比较好的java培训机构,打广告,网络猎手等滚粗
- com.mchange.v2.c3p0.ComboPooledDataSource找不到
- 还是老问题,异常处理的基础问题~
- swt的table不能编辑--急急-----部分代码如下,请高手版忙修改一下
- 哪位帮传一个JAVA与SQL2000的驱动程序,小弟笨了点没有找到
- java连接两个不同的数据库系统高手指教
- 在UltraEdit中如何配置才能直接在上面编译java程序
- 关于在图形上写文字的问题,急!在线等待
- 各位高手,请教一个简单的问题!
- 关于动态菜单项,注意,不是动态菜单(一定给分)
- java split 分割问题
- 在排序的时候发现的一个奇怪的问题。。
因为函数f接收的是一个Data对象,这里用了内部类的写法。//怎么看不懂Sqrt ss=new Sqrt(){...}什么意思
同样是内部类的写法。
Sqrt ss=new Sqrt() :定义一个Sqrt类变量,并将该变量指向新创建一个Sqrt类对象实例
new Data(){ //看不懂a.f(new Data(){...}什么意思
double data(int n){
return n*n*n;
}
}
new Data(){...}就是创建一个继承自Data的内部类,它重写了data方法
a.f(new Data(){...})这句代码就相当于下面的代码
Data d=new Data();
a.f(d);
只不过你用的是匿名的只能用一次,你想以后接着再用这个对象就不像用d那么简单了
double data(int n){
return n*n*n;
}
}
);
个人感觉new Data()这个类的实例的时候,相当与继承了了Data这个类,所以这里重新实现了Data类中的data(int n)方法,所以这个实例执行的是重写的方法,而不是Data类中已经定义的data(int n)方法。Sqrt ss=new Sqrt(){ 相同!
Date date=new Date()
{
//方法 体 重写父类方法 或者重载
}
这个new data(){}后面紧跟个大括号,{}是我看不懂的地方
double data(int n){
return n*n*n;
}
} 这里是个匿名类,只能使用一次
Sqrt ss=new Sqrt(){...}也是同理
double data(int n){
return n*n*n;
}
} 这里是个匿名类,只能使用一次 {...}里面是对原有方法的重写
Sqrt ss=new Sqrt(){...}也是同理
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());