Java匿名类
时间:2020-02-23 14:36:20 来源:igfitidea点击:
Java匿名类就像没有名称的本地类或者内部类。
我们可以使用Java匿名类同时声明和实例化一个类。
Java匿名类
Java匿名类是嵌套或者本地类。
仅当您只想使用本地类一次时,才应使用它们。
让我们来看一个Java程序中的匿名类的示例。
package com.theitroad.java.examples;
public interface Hello {
public void sayHello();
}
Java匿名类示例
" Hello"是一个接口,让我们看看如何创建Hello接口的匿名类实现。
package com.theitroad.java.examples;
public class AnonymousExample {
//nested anonymous class
public static Hello hello = new Hello() {
@Override
public void sayHello() {
System.out.println("Hello nested anonymous class");
}
};
public static void main(String[] args) {
//anonymous class inside method
Hello h = new Hello() {
@Override
public void sayHello() {
System.out.println("Hello anonymous class");
}
};
h.sayHello();
AnonymousExample.hello.sayHello();
}
}
Hello类上方也可以是一个抽象类,如下所示。
package com.theitroad.java.examples;
public abstract class Hello {
abstract void sayHello();
}
不仅如此,Hello也可以是普通的顶级类,如下所示。
package com.theitroad.java.examples;
public class Hello {
public void sayHello(){};
}
请注意,匿名类是表达式,并以分号结尾。
匿名类是通过在大括号内调用类构造函数和类定义代码来定义的。
由于匿名类没有名称,因此我们无法在类代码正文中定义构造函数。
具有构造函数参数的Java匿名类示例
如果我们的Hello类没有no-args构造函数怎么办?我们可以访问匿名类中的类变量吗?我们是否需要重写匿名类中的所有类方法?
让我们用一个简单的代码示例来回答上述问题。
package com.theitroad.java.examples;
public class Hello {
protected String s;
public Hello(String str){
this.s = str;
}
public void sayHello(){
System.out.println(s);
};
void foo(){};
}
package com.theitroad.java.examples;
public class AnonymousExample {
public static void main(String[] args) {
//anonymous class inside method
Hello h = new Hello("abc") {
@Override
public void sayHello() {
System.out.println("Hello anonymous class "+s);
}
};
h.sayHello();
}
}
Java匿名类要点
创建匿名类时,我们可以使用任何构造函数。
注意,构造函数参数也被使用。匿名类扩展顶级类并实现抽象类或者接口。
因此,访问修饰符规则照常适用。
我们可以访问受保护的变量,如果我们将其更改为私有变量,则将无法访问它。由于我们在上面扩展了
Hello类,因此不需要重写所有方法。
但是,如果它将是接口或者抽象类,则我们必须提供所有未实现方法的实现。您不能在匿名类中声明静态初始化程序或者成员接口。
匿名类可以具有静态成员,前提是它们是常量变量。

