匿名类问题,望高手指教~~~~~!!!

shimuzi 2005-09-29 10:50:03
这是个简单的匿名类的应用,在运行过程中会出现问题,程序中会注解出错行。

public class Parcel9 {
public Destination
dest(final String dest, final float price) {
return new Destination() {
private int cost;
// Instance initialization for each object:
//下面用一个大括号把下面三行语句包括进克,为什么非要不这做,不要这个括号程序就会出错??
{
cost = Math.round(price);
if(cost > 100)
System.out.println("Over budget!");
}
private String label = dest;
public String readLabel() { return label; }
}//这里是出错的地方,不知道为什么?这里有什么问题??
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest("Tanzania", 101.395F);
}
} ///:~
...全文
274 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2005-09-30
  • 打赏
  • 举报
回复
初始化块可以有 static 和 non-static ,

static initializer 只在类加载时执行一次,而 non-static initializer 则在每一个实例初始化时执行一次.

但匿名因为没有名字也不能有 static 块.

public class A{
static {
System.out.println("static initializer");
}
{
System.out.println("non-static initializer.");
}

public static void main(String[] args){
new A();
new A();
new A();
}
}
xdop 2005-09-30
  • 打赏
  • 举报
回复
这些代码完全是个悖论,我觉得这根本就不是匿名类:

在函数内匿名定义该类没有实际意义(个人观点),而且导致代码结构复杂性;

用外部类的内部实现(很显然失去了“匿名”的初衷):
class Destination{} // 该类已经有了外部声明
Destination dest(){
return new Destination(){...}; // 这只是类的重载声明,不是内部类,更不是匿名类
}

用外部接口的内部实现(这个类必须独立声明,虽然仍然是内部类,但已经不是匿名类):
interface Destination{};
Destination dest(){
class Destination_impl implements Destination{...} // 内部类,但不是匿名类
return new Destination_impl();
}

综上所述,只要使用该类,它就不能是匿名的,只是生命周期不同而已。
老無所依 2005-09-30
  • 打赏
  • 举报
回复
可以看做一个构造函数就是了
shimuzi 2005-09-30
  • 打赏
  • 举报
回复
差一个interface Destination接口。。
shimuzi 2005-09-30
  • 打赏
  • 举报
回复
在上面的程序中,加了分号;程序编译也不能通过,问题在什么地方啊???
zsjin0208 2005-09-29
  • 打赏
  • 举报
回复
在与实例变量平行的地方是不可以写可直接执行的代码的
interhanchi 2005-09-29
  • 打赏
  • 举报
回复
匿名类里面不能含有static声明!
gogon 2005-09-29
  • 打赏
  • 举报
回复
大括号内部的东西,表示load这个内部类时初始化的动作.因为内部类没有构造函数,所以需要用这种方法来初始化.去掉这个括号的话,那里面的东西算什么?既不是函数,又不是一个成员变量的声明.你什么时候见过这种代码在类的声明里,当然出错了
至于后面的.你的类你的dest有两个定义.一个是Destination dest一个是String dest,java不允许覆盖同名变量.

看你这个例子,好象是think in java 里的,看通了这本书,这些都不是问题
qybao 2005-09-29
  • 打赏
  • 举报
回复
public class Parcel9 {
public Destination
dest(final String dest, final float price) {
return new Destination() {
private int cost;
// Instance initialization for each object:
//下面用一个大括号把下面三行语句包括进克,为什么非要不这做,不要这个括号程序就会出错?? //这里的大括号是必须的,原因像楼上说的,用于初始化类,其实这里这个大括号括起来的代码叫做静态代码,完整的代码是在大括号前加上static关键字的,但这个static关键字可以省略的
{
cost = Math.round(price);
if(cost > 100)
System.out.println("Over budget!");
}
private String label = dest;
public String readLabel() { return label; }
}//这里是出错的地方,不知道为什么?这里有什么问题?? //这里少了个分号;因为整个大括号属于return语句,该语句需要分号来结束
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest("Tanzania", 101.395F);
}
} ///:~
superslash 2005-09-29
  • 打赏
  • 举报
回复
楼上说的不错,我补充一点,由于匿名类无构造函数,这样做的目的就和构造函数差不多,而且只能有此唯一的一个构造函数

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧