`

内部类:匿名内部类

 
阅读更多
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
*/

 

分享到:
评论

相关推荐

    java内部类总结(含概念和实例)

    4. 匿名内部类:匿名内部类是指没有名字的内部类,通常用在创建实例时使用。 为什么需要内部类? 内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是,每个内部类都能独立地继承自一个(接口的)...

    关于内部类的整理 内部类.xmind

    匿名内部类没有名字,通常用于创建一次性使用的简洁实现,如接口的匿名实现或继承自现有类的子类。它们常用于事件处理和回调机制。 4. 静态内部类: 静态内部类与成员内部类类似,但可以在没有外部类实例的情况下...

    Java4Android 35_内部类和匿名内部类

    在Java编程语言中,内部类和匿名内部类是两种特殊类型的类,它们为代码的组织和功能实现提供了独特的灵活性。本教程"Java4Android 35_内部类和匿名内部类"深入探讨了这两个概念,旨在帮助开发者更好地理解和运用它们...

    java 内部类使用(内部匿名类)

    内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...

    Java内部类总结.pdf

    内部类分为四种主要类型:成员内部类、局部内部类、静态内部类和匿名内部类。每种类型的内部类都有其特定的使用场景和优势。 1. 成员内部类: 成员内部类作为外部类的成员,与外部类的字段和方法并列存在。成员...

    java中的匿名内部类总结

    Java 中的匿名内部类总结 Java 中的匿名内部类是一种特殊的内部类,它没有名字,因此也称为匿名类。匿名内部类是一种简洁的编程方式,能够简化代码编写,但它也有一些限制和特点。 匿名内部类的定义 匿名内部类是...

    java 几种内部类(基础)(csdn)————程序.pdf

    内部类分为四种主要类型:成员内部类、静态内部类、局部内部类和匿名内部类。 1. 成员内部类: 成员内部类就像是外部类的一个成员,它可以访问外部类的所有成员,包括私有成员。例如,在`Outer`类中定义的`Inner`...

    Java 匿名内部类

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不定义单独类的情况下创建对象。这种类没有名字,通常用作一次性实现某个接口或继承某个类的需求。在Java编程中,匿名内部类主要用于事件处理、回调...

    java(Day12)---内部类

    内部类主要有四种类型:成员内部类、静态内部类、局部内部类和匿名内部类。 1. 成员内部类: 成员内部类可以直接访问外部类的所有成员,包括实例变量和方法。它定义的位置是在类中,但不在任何方法之内。成员内部...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

    内部类 匿名内部类 内部接口 对比说明

    本文将详细探讨内部类、匿名内部类以及内部接口的对比和使用。 首先,让我们了解一下内部类的基本概念。内部类定义在其他类的内部,编译后会生成两个独立的类文件。内部类能够自由地访问外部类的所有成员,包括私有...

    内部类知识总结3--匿名内部类

    内部类可以是静态的,也可以是非静态的,而匿名内部类则是一种没有名字的内部类,通常用于快速实现简单的回调或者接口实现。这篇总结将深入探讨匿名内部类的相关知识点。 1. **匿名内部类的概念** 匿名内部类是...

    java 匿名内部类的使用规范

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...

    Android开发匿名内部类

    在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能,如事件处理或接口快速实现。在Android开发中,匿名内部类的应用尤其广泛,因为Android框架中的许多组件(如按钮、文本...

    匿名内部类核心重点知识讲解和经典例子讲解

    匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在定义类的同时不为它提供名字。这种类主要用于创建一次性使用的对象,特别是在需要实现某个接口或者继承某个类的场合,而无需创建独立的文件来定义这个...

    内部类的相关知识-静态内部类,匿名内部类……

    ### 内部类的相关知识-静态内部类,匿名内部类…… #### 一、内部类概述 内部类(Inner Class)是 Java 中一种特殊类的定义方式,它允许在一个类的内部定义另一个类。这种设计模式提供了更为灵活的编程机制,可以...

    Java的内部类讲解案例代码(成员内部类、局部内部类、匿名内部类、静态内部类、外部类访问四种内部类、其他类访问四种内部类...)

    - 不同类型的内部类(静态内部类、成员内部类、局部内部类和匿名内部类)的区别和用法 - 内部类的优缺点以及使用场景 这些目标将帮助你理解和掌握内部类的概念,并能够在适当的时候使用内部类来解决问题...

    Android 匿名内部类作为事件监听类

    在Android开发中,匿名内部类是一种常见的编程技巧,它允许我们快速实现事件监听功能,而无需定义单独的类。本文将深入探讨如何使用匿名内部类作为事件监听类,以及其在Android开发中的应用。 首先,我们需要理解...

    Java中的内部类和匿名类

    Java 中的内部类和匿名类 Java 中的内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在 C++ 里也有,那就是嵌套类(Nested Class)。内部类从表面上看,就是在类中又定义了一个类,而实际上并没有那么...

Global site tag (gtag.js) - Google Analytics