Java基础之匿名内部类

Posted Ocean:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础之匿名内部类相关的知识,希望对你有一定的参考价值。

匿名内部类

Anonymous Inner Type

几种方法的比较

package cn.ocean888_b;

import java.security.PublicKey;

/*
 * 匿名内部类
 */

interface A {
	void test();
}

/**
 * 非abstract修饰TypeA遵从接口A,要求强制实现接口中的test方法
 */
class TypeA implements A {
	@Override
	public void test() {
		System.out.println("普通接口");
	}
}

public class Demo1 {
	public static void main(String[] args) {
		// 一般接口实现
		TypeA typeA = new TypeA();
		typeA.test();
		
		
		/*
		 * A接口的引用a,new调用A接口的构造方法,注意:并不是创建A接口对象
		 * 大括号{}里面的内容和一个普通类遵从接口A的效果是一模一样的
		 * 大括号里面的内容可以认为是类的 本体,但是大括号之前没有类名,这就是匿名内部类
		 * 
		 * new 关键字在内存堆区申请了空间,创建了一个隐含的遵从接口A的匿名内部类对象
		 * 并且把该对象的空间首地址,赋值给了接口A的引用数据类型变量
		 * 接口的引用遵从接口的类对象,这就是多态
		 */
		A a = new A() {
			@Override
			public void test() {
				System.out.println("匿名内部类的对象赋值给接口的引用");
			}
		}; // 一定注意这里有分号
		a.test();
		
		
		// 匿名内部类的匿名对象直接调用方法
		new A() {
			@Override
			public void test() {
				System.out.println("匿名内部类的匿名对象直接调用方法");
			}
		}.test();
		
		
		// 匿名内部类的匿名对象直接调用方法的参数,推荐使用此方式
		testInterface(new A() {
			@Override
			public void test() {
				System.out.println("匿名内部类的匿名对象直接调用方法的参数");
			}
		});
	}
	
	/**
	 * 需要接口A的实现类对象作为方法的参数
	 */
	public static void testInterface(A a) {
		a.test();
	}
}

之前项目的排序就可以用匿名内部类的方法去实现

	@Test
	public void testSortAge() {
		StudentManager studentManager = new StudentManager();

		studentManager.add(new Student("ocea1n", 28, '男', 99, 98, 97));
		studentManager.add(new Student("ocea1n", 38, '男', 99, 98, 97));
		studentManager.add(new Student("ocea1n", 48, '男', 99, 98, 97));
		studentManager.add(new Student("ocea1n", 58, '男', 99, 98, 97));
		studentManager.add(new Student("ocea1n", 68, '男', 99, 98, 97));
		studentManager.add(new Student("ocean", 68, '男', 99, 98, 97));

		studentManager.selectSortUsingComparator(new MyComparator() {
			
			@Override
			public boolean compare(Student stu1, Student stu2) {
				return stu1.getAge() > stu2.getAge();
			}
		});

去代替原来的impl下的文件

如:AgeAscCompare.java文件

package cn.system.student.ocean888.compare.impl;

import cn.system.student.ocean888.compare.MyComparator;
import cn.system.student.ocean888.entity.Student;

public class AgeAscCompare implements MyComparator{

	@Override
	public boolean compare(Student stu1, Student stu2) {
		return stu1.getAge() < stu1.getAge();
	}
}

以上是关于Java基础之匿名内部类的主要内容,如果未能解决你的问题,请参考以下文章

Java基础学习笔记十 Java基础语法之finalstatic匿名对象内部类

java内部类之成员内部类之匿名内部类

java基础学习——29匿名内部类

java基础知识 17-2 匿名内部类

Java——基础知识——内部类

2020/7/8 JAVA总结之:匿名对象/内部类/包的声明与访问/访问修饰符/代码块