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类,因此不需要重写所有方法。
    但是,如果它将是接口或者抽象类,则我们必须提供所有未实现方法的实现。

  • 您不能在匿名类中声明静态初始化程序或者成员接口。

  • 匿名类可以具有静态成员,前提是它们是常量变量。