【发布时间】:2014-05-08 16:27:42
【问题描述】:
我去寻找学习如何在 Java 中执行 lambda 表达式,但我却遇到了困惑。所以我对匿名类的理解是这样的:
public class SomeObject {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new SomeObject());
}
}
之前看到过匿名内部类这个词,但当时还不知道什么是正规匿名类。我看到的很多线程和视频似乎都将匿名内部类称为“匿名类”。它们是同义词吗?我对匿名内部类的理解是:
public class Rectangle {
private double length;
private double width;
private double perimeter;
public void calculatePerimeter() {
perimeter = (2*length) +(2*width);
}
public static void main(String[] args) {
Rectangle square = new Rectangle() {
public void calculatePerimeter() {
perimeter = 4*length;
}
};
}
}
所以本质上,不必为 Square 编写一个子类,然后重写 calculatePerimeter() 方法,我可以只创建一个一次性的 square 类,然后重写他们的方法。它是否正确?
因此,匿名内部类与继承有关。我不明白它的用途。也许是因为我以前从未使用过它们,或者因为我没有太多的编程经验。你能给我举个例子或解释一下什么时候有用吗?
更新:当我将匿名内部类的代码移至 IDE 时,我了解到存在错误;显然,“正方形”甚至不继承矩形的字段。这不是让它更没用了吗?
相当于:
public class Rectangle {
private double length;
private double width;
private double perimeter;
public void calculatePerimeter() {
perimeter = (2*length) +(2*width);
}
}
public class Square extends Rectangle {
@Override
public void calculatePerimeter() {
perimeter = 4*getLength();
}
public double getLength() {
return length;
}
}
【问题讨论】:
-
如果您希望子类能够访问字段,请将它们设为
protected而不是private。如果一个类将其字段设为private,则表示“这些字段是我如何实现我的方法的内部细节。所以我不希望任何人对它们进行处理,甚至我的子类也不行。而且它们可以随时被删除,或者含义可以改变,所以我不希望任何人使用它们并依赖于它们的值,因为当我的内部方法改变时他们会后悔。” -
我没看到,谢谢。但即便如此,当我编写一个新的子类时,它还是继承了那些私有实例变量。在匿名内部类的情况下,它没有。
-
你说,“当我写一个新的子类时,它会继承私有实例字段”。从技术上讲,它确实没有,但是您是否在超类inside 中声明了子类?在某些条件下甚至可以访问私有实例字段,因此即使它们不是,它也会使字段看起来像是被继承的。你能把代码贴在看起来像私有实例变量被继承的地方吗?这将是有益的。
-
@ajb 不,我的子类不在超类中。我有一个矩形超类,它具有声明的长度和宽度的实例变量。矩形构造函数将有参数要求它们。当我创建一个方形子类时,我不会声明相同的实例变量。我的方形子类构造函数会要求相同的参数并将它们设置为它。因此,从那种情况下,我假设这些字段是继承的,因为我从未在子类中声明它们,但我可以通过构造函数设置它们。
-
@ajb 但是,我不知道引擎盖下的东西。你是对的,他们永远不会被继承,所以我的观察是错误的。我认为这很好地解释了它:stackoverflow.com/a/10491050/3040381
标签: java lambda anonymous anonymous-class anonymous-inner-class