就在今天,我需要一种在不同对象之间传递函数的方法。我很快了解到您不能直接在Java中做到这一点,但是您可以传递一个wht实例,该实例显然被称为“匿名内部类”,如下所示:
定义类:
interface MyCallback {
public int execute(int i1, int i2);
}
使其成为一个实例:
MyCallback callback = new MyCallback() {
public int execute(int i1, int i2) {
return i1 + i2;
}
};
并称之为:
int sum = callback.execute(1, 2); // Sets sum to 3.
很简单。但是我不明白的是为什么它被称为“匿名”。我不只是给它起名字MyCallback吗?命名的东西不能匿名,对吗?请避免对这个术语感到困惑。
不,您说的是MyCallback()接口的实例。会使用您提供的方法逻辑为实现该接口的类提供动态名称,而该名称并不是您可以真正确定或使用的名称…因此,就您的源代码而言,它确实是匿名的。
(通常,该名称是通过在封闭类的名称末尾附加一个数字后缀来构造的,但是您无法知道将使用哪个后缀,并且不知道该名称对于该词的大多数用法是足够匿名的)
问题内容: 在Java 7和更高版本中,菱形通常可以像这样毫无问题地用于推断类型: 但是,它不能用于这样的匿名内部类: 为什么是这样?从逻辑上讲,在这种情况下,我绝对可以将类型推断为。做出该决定的逻辑上的理由是,实际上不能在匿名内部类上推断类型,还是出于其他原因而将其省略了? 问题答案: 在JSR-334中: 不支持将Diamond与匿名内部类一起使用,因为这样做通常需要扩展类文件签名属性以表示不
问题内容: 我目前正在与Sierra&Bates一起准备S(O)CJP。 关于内部类(局部或匿名方法),他们说我们无法访问局部变量,因为它们在类驻留在堆上时仍位于堆栈中,并且可以由方法返回,然后尝试访问这些变量由于该方法已结束,因此它们已在堆栈中,但已不存在… 众所周知,我们可以使用final关键字来绕开它。这就是他们在书中所说的,但是他们并没有真正解释final关键字的作用……据我所知,在方法局
问题内容: 如果我有以下课程: 我显然可以实例化该对象,并且我知道必须进行某种子类化,因为我可以覆盖Hooray方法,但是如果有子类化,为什么我不能在匿名类内创建一个新方法? 返回语法错误 问题答案: 您可以创建方法,方法没有任何问题(除了它的前面有一个大写字母之外)。问题在于,在匿名类之外,Boo方法不可用(它没有作为类API的一部分公开)。 这与实现接口的任何类都是相同的…如果该类具有不属于接
问题内容: 在进行一些基本的lambda练习时,一个看似完全相同的匿名内部类的输出给我的输出与lambda不同。 场景1 输出 2 和 2 。这里没有新内容。 但是当我这样做时: 场景2 输出 2 和 3 问题:两个输出不应该相同吗? 我想念什么吗? 为了完整起见: 方案3 输出 3 和 3 。这里也没有什么新鲜的。 更新:仍从1.8.0-b132获得相同的输出 更新#2:错误报告: https
下面的代码可以工作,但我收到了SonarLint的通知,因为我在流中使用了匿名类而不是lambda表达式,我不知道如何改进下面的代码来避免通知: 代码解释:我使用java.util的属性类,不幸的是,属性的返回
问题内容: 根据JLS: 15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。 匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.2节)。 匿名类始终是隐式最终的(第8.1.1.2节) 。 这似乎是一个特定的设计决定,所以它有一定的历史。 如果我选择上这样的课: 如果选择的话,为什么不允许我再次对其进行子类化?