我曾经搜索学习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()方法,而是可以只创建一个一次性的方形类,并在其中覆盖该方法。这是正确的吗?
所以,匿名内部类与继承有关。我不明白它的用途。也许是因为我以前从未使用过它们,或者因为我没有太多的编程经验。你能给我举例或解释什么时候有用吗?
更新:当我将匿名内部类的代码移到IDE中时,我发现有错误。所以,显然,“square”甚至不继承“rectangle”的字段。这难道不会使它更加无用吗?
等价的方式是什么?
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
,那么它就是在说:“这些字段是我实现方法的内部细节,所以我不希望任何人来干扰它们,甚至是我的子类。它们随时可能被删除或者意义会发生改变,所以我不希望任何人使用它们并依赖它们的值,因为当我的内部方法发生变化时,他们会后悔的。” - ajb