匿名内部类

匿名内部类

继承式的匿名内部类

什么是匿名内部类

匿名内部类就是没有名字的内部类

完整demo代码:

MyClass:

package com.lin183.time;

public class MyClass {
   
	public void testMyclass() {
		System.out.println("Myclass的实例方法");
	}
}

Student:

package com.lin183.time;

public class Student {

	public void testeStudent(MyClass mc) {
		System.out.println("Student类的实例方法");
	}
}

SunClass:

package com.lin183.time;

public class SunClass extends MyClass {
	
}

TestClass

package com.lin183.time;

public class TestClass {

	public static void main(String[] args) {
		// 访问Student类中的TestStuden实例方法
		//我们就需要一个MyClass类型的参数
		//1.传递MyClass类的对象
		Student stu1=new Student();
		MyClass mc=new MyClass();
		stu1.testeStudent(mc);
		
		//2.传递MyClass类的子类对象
		Student stu2=new Student();
		SunClass sun1=new SunClass();
		stu2.testeStudent(sun1);
		
		//3.传递上转型对象
		Student stu3=new Student();
		MyClass mcc=new SunClass();
		stu3.testeStudent(mcc);
		//无论我们传递的是MyClass类的子类对象,还是上转型对象,我们都需要创建一个MyClass类的子类。
		//如果我们不愿意创建MyClass类的子类,这是我们就无法传递的是MyClass类的子类对象,还是上转型对象
		//我们可以使用1匿名内部类来构造TestStuden方法的参数
		Student stu=new Student();
		stu.testeStudent(new MyClass() {
			public void testMyclass() {
				System.out.println("重写MyClass类中的实例方法");
			}
			
		});
		stu.testeStudent(sun1);
		
		//典型的匿名内部类的结果
		//这种匿名内部类的结构就相当于我们为MyClass抽象类创建了一个子类,只是我们创建的这个子类没有固定的名称,所以才叫匿名内部类
		/**
		 * new MyClass() {
			public void testMyclass() {
				System.out.println("重写MyClass类中的实例方法");
			}			
		}
		 */
	}

}
匿名内部类分为两种
第一种:继承式的匿名内部类

a) 当一个方法的参数是抽象类类型的时候,可以是传递子类对象、上转型对象

b) 子类对象、上转型对象在创建的时候需要独立构建一个子类。

典型匿名内部类

这种匿名内部类的结构就相当于我们为MyClass抽象类创建了一个子类,只是我们创建的这个子类没有固定的名称,所以才叫匿名内部类

new MyClass() {
			public void testMyclass() {
				System.out.println("重写MyClass类中的实例方法");
			}			
		}
访问Student类中的TestStuden实例方法,我们就需要一个MyClass类型的参数。
传递参数方法:
1.传递MyClass类的对象
Student stu1=new Student();
		MyClass mc=new MyClass();
		stu1.testeStudent(mc);
2.传递MyClass类的子类对象

​ 需要构建一个MyClass类的子类

子类SunClass代码

package com.lin183.time;

public class SunClass extends MyClass {
	
}
Student stu2=new Student();
		SunClass sun1=new SunClass();
		stu2.testeStudent(sun1);
3.传递上转型对象

Student stu3=new Student();
		MyClass mcc=new SunClass();
		stu3.testeStudent(mcc);

无论我们传递的是MyClass类的子类对象,还是上转型对象,我们都需要创建一个MyClass类的子类。

思考:如果我们不愿意创建MyClass类的子类,这时我们就无法传递的是MyClass类的子类对象,还是上转型对象。

答:我们可以使用匿名内部类来构造TestStuden方法的参数

改造:把MyClass变成抽象类:

package com.lin183.time;

public absolute class MyClass {
   
	public void testMyclass() {
		System.out.println("Myclass的实例方法");
	}
}

这是要想让这个Student的testStudent正常调用只能用:传递上转型对象或者传递MyClass类的子类对象,同时我们需要创建一个子类

如果不愿意创建子类的情况下我们可以使用匿名内部类来构造testStudent方法的参数

Student stu=new Student();
		stu.testeStudent(new MyClass() {
			public void testMyclass() {
				System.out.println("重写MyClass类中的实例方法");
			}		
		});

这种匿名内部类的结构就相当于我们为MyClass抽象类创建了一个子类,只是我们创建的这个子类没有固定的名称,所以才叫匿名内部类

总结:

由于产生这个匿名内部类的是一个抽象类,所以我们把这种形式叫继承的匿名内部类

优点:

​ 不需要额外创建某一个类的子类

缺点:

​ 不容易理解

接口匿名内部类

代码:

MyInterface:

package com.lin183.time2;

public interface MyInterface {
	
	//抽象方法
	void testinterface();
}

Student

package com.lin183.time2;

public class Student {

	public void testeStudent(MyInterface mi) {
		System.out.println("Student类的实例方法");
	}
}

TestClass

package com.lin183.time2;

public class TestClass {

	public static void main(String[] args) {
		// 访问Student类中的TestStuden实例方法
		//我们就需要一个MyInterface类型的参数
		//1.传递实现该接口的子类对象
		//2.传递接口回调对象
		//无论是传递实现该接口的子类对象还是传递接口回调对象,我们都要去为这个接口创建一个子类
		//我们不想为这个接口单独创建有个子类,这时我们可以使用匿名内部类来处理
		Student stu1=new Student();
		stu1.testeStudent(new MyInterface() {
			
			@Override
			public void testinterface() {
				// TODO Auto-generated method stub
				
			}
		});
	}
}
典型的接口匿名内部类:
new MyInterface() {
			
			@Override
			public void testinterface() {
				// TODO Auto-generated method stub
				
			}
		}

上面的结构就是一个匿名内部类的结构,他不是在创建MyInterface这个接口的子类对象,只是创建出来的子类没有固定的名称,所以才叫匿名内部类

总结:

由于这个匿名内部类是一个接口,所以我们把这种形式的接口式叫匿名内部类

优点:减少独立子类的创建

缺点:不易理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值