当前位置: 主页 > JAVA语言

java匿名内部类详解-java匿名内部类详解

发布时间:2023-02-09 10:46   浏览次数:次   作者:佚名

什么是内部类?

在类中定义类java匿名内部类详解,在类内部定义一个完整的类称为内部类

例如:

public class TestInner {
	public static void main(String[] args) {
		Outer o = new Outer();
		Outer.Inner inner = o.new Inner();
		inner.inner_method();
	}
}
class Outer{
	int a = 20;	//Outer类的成员变量
	//类中定义类
	class Inner{  //成员内部类
		int a = 10;
//		static int b;  成员内部类中不能定义静态成员(静态方法 和 静态变量)
		public void inner_method(){
			int a = 30;
			System.out.println(a);  //局部变量   30
			System.out.println(this.a);  //内部类的成员变量  10
			System.out.println(Outer.this.a);  //外部类的成员变量   20
			
		}
	}
	
}

从上面的程序可以看出:

Inner称为Outer的内部类,也是两个完全独立的类

内部类编译后会生成对应的.class文件,文件名为Outer$Inner.class

可以在不破坏外部类封装的情况下访问外部类的私有属性

成员内部类:

类内部的类称为成员内部类

java匿名内部类详解_java匿名内部类定义_java匿名内部类详解

它可以与定义在类内和方法外的成员变量进行比较。

同样在上述程序的帮助下java匿名内部类详解

创建成员内部类对象,首先要创建外部类对象,然后通过外部类对象构造内部类对象。new

	Outer outer = new Outer();
	Outer.Inner inner = outer.new Inner();

外类名.this指向外类的当前对象:System.out.println(Outer.this.a); //外部类的成员变量20

成员内部类不能有静态成员

public class TestMemberClass {
	public static void main(String[] args) {
	
		Outer o1 = new Outer(120);
		Outer o2 = new Outer(200);
		Outer.Inner in = o1.new Inner();
		in.print();  
	}
}
class Outer{
	private int a ;
	
	//Inner就叫做Outer 的 内部类,也是两个完全独立的类
	//在类里面的类就叫成员内部类
	/*
	 * 1,内部类可以 访问外部类的私有成员,而不破坏封装
	 */
	
	public Outer() {
	}
	public Outer(int a) {

java匿名内部类详解_java匿名内部类定义_java匿名内部类详解

this.a = a; } public class Inner{ //成员内部类中不能有静态成员 //private int s = 20; int a = 123; public void print(){ //外部类类名.this指向外部类的当前对象 System.out.println(a);//123 System.out.println("---"+Outer.this.a);//120 } } }

outer.this 表示外部类对象

外.这。 外部类属性名访问外部类属性

外.这。 外部类方法名(实参) 访问外部类方法

静态内部类:

可以类比为静态变量,成员内部类加上static就是静态内部类。 也是定义在类内,方法外,用static修饰。

class Outer{
   static class Inner{
		
	}
}

创建时需要依赖类来创建对象:

Outer.Inner inner = new Outer.Inner();

静态内部类只能访问外部类的静态成员

局部内部类:

java匿名内部类详解_java匿名内部类定义_java匿名内部类详解

它也类似于局部变量,必须在方法内部定义!

class Outer{
	public void method(){
			//类写在方法的内部,就叫做局部内部类
			class inner{
				
			}
		}
}

局部内部类创建对象时,只能在定义它的方法内部创建;

class Outer{
	private int a = 10;
	public void m1(){
		final int b = 20;
		class Inner{
			public void inner_method(){
				System.out.println(a); 	//10
				System.out.println(b); 
				System.out.println("局部内部类方法");
				
			}
		}
		Inner inner = new Inner();
		inner.inner_method();
	}
}

并且本地内部类可以访问外部类的私有属性

局部内部类也可以访问其方法的局部变量,但要求局部变量必须是final修饰的

从jdk 8.0开始,final默认加入局部变量

匿名内部类:

特殊的局部内部类。具有局部内部类的特点

匿名内部类

java匿名内部类详解_java匿名内部类定义_java匿名内部类详解

使用的三个条件

匿名内部类怎么写

new interface(){实现方法};

匿名内部类不能定义构造函数

定义匿名内部类的写法:定义类、实现接口、新建对象三步

IA ia = new IA(){		//IA 接口名  匿名内部类想要实现的接口
				public void m1() {
					System.out.println("匿名内部类");
				}
			};
			//ia引用 可以直接操作内部类中方法
			ia.m1();

下面展示了匿名内部类的具体用法:

package test;
public class TestNiMingClass {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 Teacher t = School.getTeacher(0);
		 t.teach();
	
	}
}
class School{
	public static Teacher getTeacher(int i){
		//两个局部内部类
		class Teacher1 implements Teacher{
			public void teach(){
				System.out.println("胡老师讲课");

java匿名内部类详解_java匿名内部类定义_java匿名内部类详解

} } class Teacher2 implements Teacher{ public void teach(){ System.out.println("刘老师讲课"); } } if (i%2 == 0) { //return new Teacher1(); //定义匿名内部类的写法 //定义类、实现接口、new对象 三步合一 //局部内部类用法 //return new Teacher1(); //匿名内部类用法 return new Teacher(){ public void teach(){ System.out.println("胡老师讲课"); } }; }else{ return new Teacher2(); } } } interface Teacher{ void teach(); }

匿名内部类的好处:

接口是public的,接口的实现类隐藏为内部类,强行弱耦合

缺点是匿名内部类的写法实在是难受,可读性太差