Java初始化
我已经多次遇到此代码,我想知道它的含义或等效于:Java初始化,java,Java,我已经多次遇到此代码,我想知道它的含义或等效于: A a = new A() { // declare some methods and whatever }; 以上是什么意思?它等价于什么(如果它等价于任何东西)?这是扩展/实现类/接口A的匿名类的实例化。这是扩展/实现类/接口A的匿名类的实例化。他们正在声明。类A可能是接口或抽象类,必须实现方法才能成为A的子类。Java允许您使用匿名类动态定义这些方法 例如,对于ActionListener,只有一种方法可以实现,即actionPerf
A a = new A() {
// declare some methods and whatever
};
以上是什么意思?它等价于什么(如果它等价于任何东西)?这是扩展/实现类/接口A的匿名类的实例化。这是扩展/实现类/接口A的匿名类的实例化。他们正在声明。类
A
可能是接口或抽象类,必须实现方法才能成为A
的子类。Java允许您使用匿名类动态定义这些方法
例如,对于ActionListener
,只有一种方法可以实现,即actionPerformed(ActionEvent)
。很多时候,在匿名类中定义该方法更容易,如下所示:
ActionListener myListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
// do other stuff for action performed
}
}
根据OP的评论进行编辑
您当然可以为ActionListener
创建一个类文件,并创建一个新的类实例,而不是创建一个匿名类。也就是说,假设你可以在一个单独的类中完成所有你需要做的事情。很多时候,定义了匿名类和内部类,以便您可以访问外部类的字段和方法。如果内部类“属于”外部类而不属于任何其他类,那么定义内部类或匿名类也要面向对象很多倍 他们正在宣布一项新的计划。类A
可能是接口或抽象类,必须实现方法才能成为A
的子类。Java允许您使用匿名类动态定义这些方法
例如,对于ActionListener
,只有一种方法可以实现,即actionPerformed(ActionEvent)
。很多时候,在匿名类中定义该方法更容易,如下所示:
ActionListener myListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
// do other stuff for action performed
}
}
根据OP的评论进行编辑
您当然可以为
ActionListener
创建一个类文件,并创建一个新的类实例,而不是创建一个匿名类。也就是说,假设你可以在一个单独的类中完成所有你需要做的事情。很多时候,定义了匿名类和内部类,以便您可以访问外部类的字段和方法。如果内部类“属于”外部类而不属于任何其他类,那么定义内部类或匿名类也要面向对象很多倍 它正在生成一个匿名的内部类:a
不是a
本身的一个实例,而是a
新生成的子类的一个实例,就好像您编写了
public class MadeUpName extends A {
...
}
A a = new MadeUpName();
但是不必编造一个
MadeUpName
,也不用太多赘言。它是一个匿名的内部类:a
不是a
本身的一个实例,而是a
的一个新生成的子类的一个实例,就好像你写了这样的东西一样
public class MadeUpName extends A {
...
}
A a = new MadeUpName();
但是不必编造一个
MadeUpName
,而且不用太多赘言。这是一个匿名类。虽然我从未广泛使用过它们,但它们对于只使用一次类,或者不想用不会看到太多重用的东西“污染”顶级类层次结构的情况非常方便
您可以将它们放在类内(使用标准的公共、私有、受保护的关键字)或类方法内(内部类)
我找不到一个非常好、简洁的写作/教程,但这没关系:
相关的:
- 这是一个匿名类。虽然我从未广泛使用过它们,但它们对于只使用一次类,或者不想用不会看到太多重用的东西“污染”顶级类层次结构的情况非常方便
您可以将它们放在类内(使用标准的公共、私有、受保护的关键字)或类方法内(内部类)
我找不到一个非常好、简洁的写作/教程,但这没关系:
相关的:
newhashmap(){{put(“one”,“val1”);put(“two”,“val2”);put(“three”,“val3”);}
@ratchetfreak当然,使用双括号初始化的开销通常不值得提供简洁的语法。@ratchetfreak加上它真正有价值的实例(例如初始化集合),编译器会抱怨版本UUID。@Tim Pote,为什么不能将匿名类分离到另一个.java文件中并在其中声明,然后在原始文件中使用其实例?这不是更清楚吗?它也可以是一个具体的类,您希望为其提供一些附加功能,或者希望使用双括号初始化newhashmap(){{put(“one”,“val1”);put(“two”,“val2”);put(“three”,“val3”);}
@ratchetfreak当然,使用双括号初始化的开销通常不值得提供简洁的语法。@ratchetfreak加上它真正有价值的实例(例如初始化集合),编译器会抱怨版本UUID。@Tim Pote,为什么不能将匿名类分离到另一个.java文件中并在其中声明,然后在原始文件中使用其实例?这不是更清楚吗?