我去搜索瞭解如何在Java中使用lambda表達式,但是卻出現了混亂。所以,我的一個匿名類的理解是這樣的:關於匿名類vs匿名內部類的困惑
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;
}
};
}
}
所以基本上,而不必寫廣場一個子類,然後覆蓋calculatePerimeter()方法,我只是做一個一次性的平方類別,並覆蓋在他們的方法。它是否正確?
所以,匿名內部類與繼承有關。我不理解它的使用。也許,這是因爲我以前從未使用過它們,或者因爲我沒有太多的編程經驗。你可以給我一些例子或解釋它的用處嗎?
更新:當我將匿名內部類的代碼移到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',它就會說「這些字段是我如何實現我的方法的內部細節,所以我不希望任何人把它們弄糟,甚至不需要我的子類,並且可以隨時刪除它們,或者意思可以改變,所以我不希望任何人使用它們,並且根據它們的價值觀,因爲當我的內部方法改變時,它們會後悔。「 – ajb
我沒有看到,謝謝。但即便如此,當我編寫一個新的子類時,它會繼承這些私有實例變量。在匿名內部類的情況下,它沒有。 – Abdul
你說:「當我編寫一個新的子類時,它會繼承私有實例字段」。在技術上它確實沒有,但是你是否聲明瞭子類_inside_超類?即使私有實例字段可以在某些條件下被訪問,所以它會使它看起來像字段被繼承,即使它們不是。你可以將代碼發佈到私有實例變量被繼承的地方嗎?這將是有益的。 – ajb