我实例化了一个匿名类的对象,我添加了一个新方法。
Date date = new Date() {
public void someMethod() {}
}
我想知道是否可以从外部调用此方法,类似于:
date.someMethod();
答案 0 :(得分:26)
好问题。答案是否定的。您无法直接致电date.someMethod();
让我们先了解这是什么。
Date date = new Date() { ... };
上面是匿名(没有名字)子类,它正在扩展Date类。
当您看到类似的代码时,
Runnable r = new Runnable() {
public void run() {
}
};
这意味着您已经定义了一个匿名(没有名称)类,它正在实现(不扩展)Runnable接口。
因此,当您致电date.someMethod()
时, 无法能够致电,因为someMethod
<{1}}上面的案例超类是superclass.
类。它遵循简单的首要规则。
但是,如果您想拨打Date
,请按照以下步骤操作。
Fisrt way&gt;
使用引用变量“someMethod
”
date
第二种方式&gt;
使用新创建的Date类的匿名子类。
date.getClass().getMethod("someMethod").invoke(date);
答案 1 :(得分:9)
基本上没有。
然而,这种丑恶可以做到......
Date date = new Date() {
public Date someMethod() {
//do some stuff here
return this;
}
}.someMethod();
但除此之外,您只能使用反射调用该方法(在父类中不存在),如下所示:
date.getClass().getMethod("someMethod").invoke(date);
(为了清楚起见,试试留下了......)
但严重的是,不要这样做!我觉得被编写此代码的人所厌恶,如果我在代码库中偶然发现这个问题,我必须继续工作。
答案 2 :(得分:8)
不使用反射你不能:该方法不是Date API的一部分,date
只是编译器所关注的日期。
您可以使用someMethod
的唯一方法是直接在新创建的实例上调用它:
new Date() { public void someMethod() { } }.someMethod();
答案 3 :(得分:2)
不,这就是本地类的方法。
class MyDate extends Date() {
public void someMethod() {...}
}
MyDate date = new MyDate();
date.someMethod();
答案 4 :(得分:2)
在Java 10+中,使用var
关键字
var date = new Date() {
public void someMethod() { }
};
date.someMethod();
答案 5 :(得分:1)
我不知道你为什么会这样做,但是由于Date
没有声明someMethod
,所以不可能这样做。
但是,您可以在方法中声明一个本地类,例如:
void foo ( )
{
class MyDate extends Date
{
public void someMethod( );
}
MyDate date = new MyDate( );
date.someMethod( );
}
我再次建议首先使用normal
课程,因为本地课程的性质无法进行测试。