匿名内部类的构造器重载问题

goldenguozhu 2012-10-05 12:13:14
在think in Java 4th 的10.6节末尾提到“所以对于匿名类而言,实例初始化的实际效果就是构造器。当然它受到了限制--你不能重载实例初始化方法,所以你仅有一个这样的构造器。”但是我自己根据书中的例子重新写了一个具备重载功能的构建器,在jdk1.6下运行正确,想请问各位大侠这是何解,另外为何我将Destination d重新指向用重载的构建器生成的另一个内部类对象,编译器报错,谢谢赐教!
interface Destination {
String readLabel();
}

public class Parcel10{
public Destination
destination(final String dest){
return new Destination(){
private String label = dest;
public String readLabel(){ return label;}
{System.out.println("aaa");}
};
}
public Destination
destination(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;}
};
}
public static void main(String[] args) {
Parcel10 p = new Parcel10();

Destination d = p.destination("Tasmania");
//编译器提示:已在main(java.lang.String[])中定义d
//Destination d = p.destination("Tasmania",101.395F);
Destination t = p.destination("Tasmania",101.395F);

}
}

...全文
317 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiji0088 2013-10-02
  • 打赏
  • 举报
回复
{ cost = Math.round(price); if (cost > 100) System.out.println("Over budget!"); } 请问此块是什么块?是匿名块吗?还是new Destination()匿名内部类的“匿名构造器”?
kottar 2012-10-05
  • 打赏
  • 举报
回复
/**
*方法1,返回Destination 的一个对象
*/
public Destination destination(final String dest){
return new Destination(){
private String label = dest;
public String readLabel(){
return label;
}

{
System.out.println("aaa");
}
};
}

/**
*方法2,返回Destination 的一个对象,与方法1属于方法重载关系
*/
public Destination destination(final String dest,final float price){
return new Destination(){
private int cost;
{
cost = Math.round(price);
if (cost > 100)
System.out.println("Over budget!");
}
对,这两个方法中的方法实现都是使用了匿名内部类,但是它是使用了匿名内部类来创建对象,然后返回,然后您在main方法中Destination d;同时定义了两个相同的应用变量d,你感觉这能对吗?这符合Java语言规范吗?这跟p所调用的方法中的匿名内部类有啥关系?我不知道您读的think in Java 4th是什么教材,但我可以肯定的告诉您,这个匿名内部类,通俗的讲就是没有类名字的内部类,它通常被用来一次性的创建对象的,其它的没有什么注意点。
杀手 2012-10-05
  • 打赏
  • 举报
回复
我的理解是你想先根据第一个构造函数实例化一个,然后将指向第一个的引用指向利用第二个构造函数实例化的对象。
Destination d = p.destination("Tasmania",101.395F);
改为d = p.destination("Tasmania",101.395F);
你的方法是生成一个同名的引用d,并不是重新指向,所以系统报错

62,620

社区成员

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

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