[英]What is the difference between these two declaration of anonymous class
我找不到这两个匿名类声明之间的区别。
class Boo {
Boo(String s) { }
Boo() { }
}
class Bar extends Boo {
Bar() { }
Bar(String s) {super(s);}
void zoo() {
Boo f = new Boo() { // Line-1
void method()
{
System.out.println("Inside anonymous");
}
};
}
}
class Boo {
Boo(String s) { }
Boo() { }
}
class Bar extends Boo {
Bar() { }
Bar(String s) {super(s);}
void zoo() {
Boo f = new Boo("Random String") { // Line-2
void method()
{
System.out.println("Inside anonymous");
}
};
}
}
在这里,我理解的是,匿名类是Boo
类的子类,其实例由引用变量f
多态引用。 但是,使用无参数构造函数(第1行)和参数化构造函数(第2行)有什么区别。
Boo
定义了多个构造函数。 和
Boo f = new Boo("Random String") { // Line-2
void method()
{
System.out.println("Inside anonymous");
}
};
因为它是一个匿名类,并且立即提供了实现,所以没有人使用该字符串,并且在那里传递字符串是多余的。
让我们在类中添加一些“肉”,以了解它们之间的区别。 更改Boo
以便它实际上对字符串起作用:
class Boo {
private String s = "Default";
Boo(String s) {
this.s = s;
}
Boo() {
}
protected String getString() {
return s;
}
}
现在,它存储了字符串,任何子类都可以通过getString()
方法检索该字符串。
现在扩展我们的Bar
:
class Bar extends Boo {
Bar() {
}
Bar(String s) {
super(s);
}
void zoo() {
Boo anon1 = new Boo() { // Line-1
void method()
{
System.out.println("Inside anonymous");
}
@Override
public String toString() {
return "First anonymous subclass of Boo with value " + getString();
}
};
Boo anon2 = new Boo("Some Random Value") { // Line-2
void method()
{
System.out.println("Inside anonymous");
}
@Override
public String toString() {
return "Second anonymous subclass of Boo with value " + getString();
}
};
System.out.println(anon1);
System.out.println(anon2);
}
}
因此,我在同一方法内创建了两种类型的匿名类,然后将它们打印出来。 请注意,我已经向每个匿名类添加了toString
方法。 toString
方法在返回的值中使用Boo
的getString
。
现在,当您调用new Bar().zoo()
时会发生什么?
你得到的输出
First anonymous subclass of Boo with value Default Second anonymous subclass of Boo with value Some Random Value
因此,第一个对象anon1
是使用Boo
的no-args构造函数创建的。 因此,private s
值为Default
。 这反映在toString()
方法中。 第二个对象是由Boo
的另一个构造函数创建的,它赋予s
一个不同的值。 现在,该值已成为打印值的一部分。
因此,当构造函数实际执行某项操作时,匿名类利用了在构造函数中传递的信息,那么无论是否传递参数,它都会有所不同。
笔记
Bar
本身也是Boo
的子类,但在您的示例中,它没有区别。 它可能是一个完全独立的类。 method()
永远不会使用,也不能使用(除非反射等),因为对匿名类的唯一引用是通过类型Boo
,该类型没有可继承的method()
。 您不能从超类引用中调用子类的方法,除非该方法被继承或覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.