匿名内部类(没有类名)
前文我们探讨了静态内部类、成员内部类、局部内部类,接下来看一看Java内部类的最后一个匿名内部类。
匿名内部类就是局部内部类的进一步隐藏, 所以局部内部类的所有限制都对其生效。
局部内部类:定义了之后在局部区域内仍旧可以创建多个对象
匿名内部类:声明一个类之后就只能创建一个对象了,因为他并没有类名字。开发中,最常用到的内部类就是匿名内部类了。
使用匿名内部类的目的:
1、因为接口和抽象类都不能实例化对象
2、通常访问一个接口时要:(1)定义子类、(2) 重写接口中的方法、(3) 创建子类对象、(4) 调用重写后的方法
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下我们就可以省略掉该类的定义,而改为使用匿名内部类。
3、类在定义后马上用到。
4、类非常小(SUN推荐是在4行代码以下)
5、给类命名并不会导致你的代码更容易被理解。
特点
一、因为在创建匿名内部类的时候,会立即创建它的对象,可知匿名内部类不能是抽象类,所以其必须继承一个抽象类或者实现一个接口。
匿名内部类的定义格式:
接口或抽象类名称 对象名 = new 接口或抽象类名称() {
//覆盖重写所有抽象方法(匿名内部类的内容)
};
意思是创造一个实现(继承)了接口或抽象类的类的对象。
1、定义接口
public interface Hello{
public abstract void Run();
}
2、创造匿名内部类的对象
public class Demo {
public static void main(String[] args) {
Hello hello = new Hello() {//匿名内部类
public void Run() {
System.out.println("跑步");//重写所有抽象方法
}
};
hello.Run();//输出结果 跑步
}
}
二、匿名内部类没有类名,因此没有构造方法。
三、匿名内部类访问外部类成员变量或成员方法必须用static修饰,否则会报错。
四、匿名内部类不能定义任何静态成员、方法。
五、内部类可以访问外部类私有变量和方法。
当匿名内部类和外部类有同名变量(方法)时,默认访问的是匿名内部类的变量(方法),要访问外部类的变量(方法)则需要加上外部类的类名。
六、根据声明的位置,判断匿名内部类是成员内部类还是方法内部类。注:一般是方法内部类,这时就具备方法内部类的特性。
七、匿名内部类不能是public,protected,private,static。
八、一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
匿名内部类实现线程:匿名内部类实现线程的两种方式
匿名内部类与匿名对象的理解
- 匿名内部类,在【创建对象】的时候,只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么就需要使用单独定义的实现类
- 匿名对象,在【调用方法】的时候,只能调用唯一一次。如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
- 匿名内部类是省略了【实现类/子类名称】,匿名对象是省略了【对象名称】
匿名对象的调用方式:
new 类名.方法名(参数);
public class Demo {
public static void main(String[] args) {
new Hello().Run("Hello");//调用匿名对象
}
}
class Hello{
public void Run(String a) {
System.out.println(a + “ World");//输出结果Hello World
}
}
匿名内部类和匿名对象同时使用
public class Demo {
public static void main(String[] args) {
new Hello() {//匿名内部类
@Override
public void Run(String a) {
System.out.println(a+" World");
}
}.Run("Hello");//输出结果Hello World
}
}
interface Hello{
public void Run(String a) ;
}
转载:https://blog.csdn.net/weixin_45797022/article/details/104561274