java匿名内部类实例

匿名内部类,也就是没有名字的内部类
正因为没有名字,所以这个匿名内部类只能使用一次,这怎么理解?很好理解,因为是匿名的,所以其他方法不能直接调用匿名内部类的方法,因为没有名字找不到这个方法,所以只能通过匿名内部类的使用方法来使用。
而且匿名内部类还有一个前提条件:必须继承一个父类或者实现一个接口。这个也很好理解,匿名嘛,必须要有依托的主体才能存在。

实例1:不实用匿名内部类来实现抽象方法

abstract class Person {
		public abstract void eat();
		public void drink(){
			System.out.println("haha");
		}
	}

class Child extends Person {

		@Override
		public void eat() {
			System.out.println("eat something");
		}
	}
public class Demo{
	public static void main(String[] args) {
		Person p = new Child();
		p.eat();
		p.drink();
	}
}

这个很好理解,继承然后实例化然后调用,但是此处的child类只使用了一次,没有其他实例再使用这个Child类了,那么将其编写成一个独立的类岂不是很麻烦?
这个时候就引入了匿名内部类,类似调用的时候去创建一个就好了

实例2:匿名内部类的基本实现

abstract class Person {
		public abstract void eat();
		public void drink(){
			System.out.println("haha");
		}
	}

public class DemoTest2 {
	public static void main(String[] args) {
		Person p = new Person() {
			
			@Override
			public void eat() {
				// TODO Auto-generated method stub
				System.out.println("eat something");
			}
		};
		p.eat();
		p.drink();
	}
}

可以看到,我们直接将抽象类Person中的方法在大括号中实现了,这样可以省略一个类的书写,而且,匿名内部类还能用于接口上其实接口跟抽象类是差不多的

interface Person{
	public void eat();
}

public class DemoTest3 {
	public static void main(String[] args) {
		Person p = new Person() {
			
			@Override
			public void eat() {
				// TODO Auto-generated method stub
				System.out.println("eat something");
			}
		};
		p.eat();
	}
}

由上面的例子可以看出,只要一个类是抽象的或者是一个接口,那么其子类中的方法(Child类)都可以使用匿名内部类来实现,最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或者继承Runnable接口
实例4:Thread类的匿名内部类实现

public class DemoTest4 {
	public static void main(String[] args) {
		Thread t = new Thread(){
			public void run(){
				for (int i = 0; i < 5; i++) {
					System.out.println(i + " ");
				}
			}
		};
		t.start();
	}
}

实例5:Runnable接口的匿名内部类实现

public class DemoTest5 {
	public static void main(String[] args) {
		Runnable r = new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i < 5; i++) {
					System.out.println(i + " ");
				}
			}
		};
		Thread t = new Thread(r);
		t.start();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值