2011-03-01 133 views
0
class One { 
Two two() { 
    return new Two() { 
     Two(){} 
     Two(String s) { 
      System.out.println("s= "+s); 
     } 
    }; 
    } 
} 

class Ajay { 
    public static void main(String ...strings){ 
     One one=new One(); 
     System.out.println(one.two()); 
    } 
} 

上面的示例代码不能编译。它说“两个不能解决”。 这段代码有什么问题?要创建匿名内部类

new Two()

+0

有没有问题的代码? – 2011-03-01 10:58:54

回答

0
new Two() { 
    Two(){} 
    Two(String s) { 
     System.out.println("s= "+s); 
    } 
}; 

匿名内部类被称为匿名,因为它不具有其自己的名称,并且具有由所述基类或接口它延伸/工具的名称来引用。

在您的示例中,您将创建Two的匿名子类,因此Two必须在类或接口的某个位置进行声明。如果已经声明了类Two,那么您的类路径中没有它或忘记导入它。

+0

Thanx.I忘记宣布类Two.infact我不知道应该宣布类2应该是因为书iam引用不提这个.. – 2011-03-01 11:45:03

1

所以必须在classpath中有效的类。

使其

class Two{ 

} 

class One { 
Two two() { 
    return new Two() { 
//  Two(){} 
//  Two(String s) { 
//   System.out.println("s= "+s); 
//  }//you can't override constuctors 
    }; 
    } 
} 

或新的左侧有一定的超类或接口,使其工作

+0

@jigar ...不,他正在使用下一代动态类生成,它会自动创建任何不在类路径中的类,并为其创建明智的方法;) – 2011-03-01 10:32:43

+0

由于“Two”实际上是作为匿名内部类,将它声明为接口或抽象类而不是类可能更有意义。 – MAK 2011-03-01 10:38:10

+0

@MAK *作为匿名内部类实现*仅用于显示的代码 – 2011-03-01 10:41:29

0

你没有申报的Two类。您声明了类One和私有成员two,其中twoTwo类的对象,您尝试通过匿名构造来初始化该类。

+0

'two'没有声明为私有 – Alpine 2011-03-01 11:12:48

+0

'Two(){}'是构造函数,其中'Two two(){}'是班'一'。 – Alpine 2011-03-01 11:15:32

+0

是的,你说得对。我错误地解释了你的代码。抱歉。 – 2011-03-01 11:54:37