欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内部类:匿名内部类

程序员文章站 2022-05-22 09:05:51
...
package org.lgy.study.innerclass;

public class AnonymousTest{
	public void test(Product p){
		System.out.println("p.name = " + p.getName() + "  p.price = " + p.getPrice());
	}
	
	public static void main(String[] args){
		final String str = "******";
		
		AnonymousTest a = new AnonymousTest();
		/*
		匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。
		匿名内部类不能是抽象类,也就是说匿名内部类必须实现它的抽象父类或接口里包含的全部抽象方法,
		如果有需要,也可以重写父类中的普通方法。
		匿名内部类不能定义构造器,但匿名内部类可以定义实例初始化块,通过实例初始化块来完成构造器需要完成的事情。
		*/
		a.test(new Product(){
			{
				System.out.println("init block");
				//如果匿名内部类需要访问所在方法的局部变量,则必须使用final修饰符来修饰该局部变量。
				System.out.println(str);
			}
			
			public String getName(){
				return "CPU";
			}
			
			public double getPrice(){
				return 500.1;
			}
		});
	}
}

interface Product{
	public abstract String getName();
	public abstract double getPrice();
}

 

package org.lgy.study.innerclass;

public class AnonymousTest{
	private String str1 = "!!!";
	private static String str2 = "@@@";
	
	/*
	情况1:匿名内部类位于实例成员方法内
	如果匿名内部类位于实例成员方法内,当调用匿名内部类所在的方法时必定已创建外部类对象,
	所以在匿名内部类中可以访问外部类的所有成员(静态的、非静态的、成员变量、成员方法)
	*/
	public void method1(){
		Product p = new Product(){
			/*
			匿名内部类中不能定义构造器、静态初始化块,因此不能再构造器、静态初始化块完成初始化,
			但是匿名内部类中可以定义普通初始化块来完成初始化
			*/
			{
				this.name = "CPU";
				this.price = 500.0;
			}
			//匿名内部类中可以定义非静态成员(包括成员变量和成员方法)
			private String name;
			private double price;
			/*
			匿名内部类中不能定义静态成员(包括成员变量和成员方法),但可以定义静态常量
			private static String str = "";
			public static void method(){}
			*/
			
			//匿名内部类中可以定义静态常量
			private static final String str = "123";
			
			public String getName(){
				return name;
			}
			
			public double getPrice(){
				return price;
			}
			
			//匿名内部类中可以定义自己的方法
			public Product method(){
				System.out.println(AnonymousTest.this.str1);
				System.out.println(AnonymousTest.str2);
				AnonymousTest.this.method3();
				AnonymousTest.method4();
				
				return this;
			}
		}.method();
		System.out.println(p.getName());
		System.out.println(p.getPrice());
	}
	
	/*
	情况2:匿名内部类位于静态方法内
	如果匿名内部类位于静态成员方法内,当调用匿名内部类所在的方法时可能并没有创建外部类,
	所以在匿名内部类中只能访问静态成员,不能访问非静态成员
	*/
	public static void method2(){
		Product p = new Product(){
			/*
			匿名内部类中不能定义构造器、静态初始化块,因此不能再构造器、静态初始化块完成初始化,
			但是匿名内部类中可以定义普通初始化块来完成初始化
			*/
			{
				this.name = "CPU";
				this.price = 500.0;
			}
			//匿名内部类中可以定义非静态成员(包括成员变量和成员方法)
			private String name;
			private double price;
			/*
			匿名内部类中不能定义静态成员(包括成员变量和成员方法),但可以定义静态常量
			private static String str = "";
			public static void method(){}
			*/
			
			//匿名内部类中可以定义静态常量
			private static final String str = "123";
			
			public String getName(){
				return name;
			}
			
			public double getPrice(){
				return price;
			}
			
			//匿名内部类中可以定义自己的方法
			public Product method(){
				//位于静态方法中的匿名内部类无法访问外部类中的非静态成员变量
				//System.out.println(AnonymousTest.this.str1);
				System.out.println(AnonymousTest.str2);
				//位于静态方法中的匿名内部类无法访问外部类中的非静态成员方法
				//AnonymousTest.this.method3();
				AnonymousTest.method4();
				
				return this;
			}
		}.method();
		System.out.println(p.getName());
		System.out.println(p.getPrice());
	}
	
	public void method3(){
		System.out.println("***");
	}
	
	public static void method4(){
		System.out.println("---");
	}
	
	public static void main(String[] args){
		new AnonymousTest().method1();
		System.out.println("\n");
		AnonymousTest.method2();
	}
		
}

interface Product{
	public abstract String getName();
	public abstract double getPrice();
}

/*
结果:
!!!
@@@
***
---
CPU
500.0


@@@
---
CPU
500.0
*/