Abd*_*dul 2 java lambda anonymous anonymous-inner-class anonymous-class
我去搜索学习如何在Java中使用lambda表达式,但对我来说却出现了混乱.所以我对匿名类的理解是这样的:
public class SomeObject {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new SomeObject());
}
}
Run Code Online (Sandbox Code Playgroud)
我之前看过匿名内部类这个术语,但那个时候,我不知道普通的匿名类是什么.我看到很多线程和视频似乎只是将匿名内部类称为"匿名类".他们是同义词吗?我对匿名内部类的理解是:
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;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,不是必须为Square编写子类,然后重写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;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我对匿名类的理解是这样的:
public class SomeObject {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new SomeObject());
}
}
Run Code Online (Sandbox Code Playgroud)
那里没有匿名课程.该类SomeObject
有一个名称......因此它不是匿名的.实际上,它只是一个普通的(非嵌套的,非内部的,非匿名的)Java类.
我之前看过匿名内部类这个术语,但那个时候,我不知道普通的匿名类是什么.
没有"常规匿名课"这样的东西.所有Java匿名类都是"内部".
正如JLS所说:
"内部类是一个嵌套类,没有显式或隐式声明为静态.
内部类包括本地(§14.3),匿名(§15.9.5)和非静态成员类(§8.5).
因此,匿名内部类与继承有关.
匿名内部类确实涉及继承,但这不是使它们"内在"的原因.往上看.
我的意思是"list.add(我的意思是"list.add(new SomeObject());".这一次,我认为你添加到ArrayList的对象被称为匿名类,因为我们没有命名它.);".这一次,我认为你添加到ArrayList的对象被称为匿名类,因为我们没有命名它.
你错了.一个对象类中没有1.
在new SomeObject()
正在创建一个对象,而不是一类.但那是正常的.对于JLS而言,对象/实例没有名称......
现在变量和字段都有名称......但变量不是对象/实例或类.它们是名称和槽之间的绑定,可以保存对象的引用(如果这是类型声明允许的话).
1 - 除了java.lang.Class
...... 的实例外,从理论的角度来看,对象实际上并不是类/类型.
或者它只是一个匿名对象,我有两个混合?
不.对象没有名称.所有Java对象都是"匿名的".这不是一个有用的区别.(以及上面我谈论变量的地方......)
至于你的Rectangle
/ Square
examples,它们与匿名类,内部类,嵌套类或类似的东西无关.它们只是顶级类,使用普通的Java继承.(不是说我建议还有另一种"非普通"的继承......)