package com.neibulei;
/**
- 匿名内部类 没有名字的内部类
- 1.必须实现一个接口或者继承一个抽象类
- 2.匿名内部类不能创建对象 只能使用一次
- 3.优点:减少子类的编写
- 4.缺点:阅读性较差
- 5.通常用于接口或者抽象类中只有一个抽象方法的情况
- @author WHD
*/
public class Test4 {
public static void main(String[] args) {
// Info info = new InfoImpl();
// info.print();
//重写接口的方法
//匿名内部类是没有名字的,所以我们没办法用其类名创建实例
//这里创建的是实现此接口子类的对象,因为没有名字,只能直接写接口名,
//接口名的作用只表明创建的对象是Info接口类型,
//接口不能创建对象,只能通过其子类实例向上转型的方式
//本句是创建一个Info接口类型的匿名类的对象,这种方式匿名类自动实现Info接口,是Info接口子类
Info info = new Info() {
//重写接口方法
@Override
public void print() {
System.out.println("通过匿名内部类的方法实现接口");
}
//重写接口方法
@Override
public void m1() {
System.out.println("m1方法");
}
//重写接口方法
@Override
public void m2() {
System.out.println("m2方法");
}
//下面的分号是创建对象语句的结束符,例:A a=new A(); 和匿名内部类无关,类末尾大括号后面不需要分号
};
//调用匿名类方法
info.print();
//匿名内部类是没有名字的,所以我们没办法用其类名创建实例
//这里创建的是继承此类的对象,因为没有名字,只能直接写父类名,
//父类名的作用只表明创建的对象是A类类型,
//抽象类不能创建对象,只能通过其子类实例向上转型的方式
//本句是创建一个A类类型的匿名类的对象,这种方式匿名类自动继承A抽象类,是A抽象类子类
A a = new A() {
//重写方法
@Override
public void m1() {
System.out.println("通过匿名内部类的方式实现抽象类");
}
//下面的分号是创建对象语句的结束符,例:A a=new A(); 和匿名内部类无关,类末尾大括号后面不需要分号
};
//new Runnable(){}是创建一个Runnable接口类型的匿名类的对象,这种方式匿名类自动实现Runnable接口,
//是Runnable接口子类
//一个类实现Runnable接口,重写run方法并创建对象,
//Thread类 创建对象并接受实现Runnable接口类的对象传参
//Thread类对象调用start方法开启线程,本处匿名类是实现Runnable接口的匿名子类
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程的内容");
}
//设置线程名字
}, "线程A");
//启动线程
t1.start();
}
}
interface Info{
void print();
void m1();
void m2();
}
//class InfoImpl implements Info{
//
// @Override
// public void print() {
// System.out.println(“接口方法打印信息”);
// }
//
//}
abstract class A{
public abstract void m1();
}