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
类,因此不需要重写所有方法。
但是,如果它将是接口或者抽象类,则我们必须提供所有未实现方法的实现。您不能在匿名类中声明静态初始化程序或者成员接口。
匿名类可以具有静态成员,前提是它们是常量变量。