匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
实例1:不使用匿名内部类来实现抽象方法
abstract class Person {
public abstract void eat();
}
class Child extends Person {
public void eat() {
System.out.println("eat something");
}
}
public class Demo {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}
运行结果:eat something
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用
但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?
这个时候就引入了匿名内部类
实例2:匿名内部类的基本实现
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
运行结果:eat something
可以看到,我们直接将抽象类Person中的方法在大括号中实现了
这样便可以省略一个类的书写
并且,匿名内部类还能用于接口上
实例3:在接口上使用匿名内部类
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
运行结果:eat something
由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是实现Runnable接口
实例4:Thread类的匿名内部类实现
public class Demo {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}
运行结果:1 2 3 4 5
实例5:Runnable接口的匿名内部类实现
public class Demo {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}
运行结果:1 2 3 4 5
2.匿名内部类的注意事项
注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个
new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
·内部类只能访问外部类的静态变量或静态方法。
匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名
分享到:
相关推荐
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...
170331-01.匿名内部类总结.java 170331-01.匿名内部类总结.java 匿名 内部类 总结 java
这篇总结将深入探讨匿名内部类的相关知识点。 1. **匿名内部类的概念** 匿名内部类是内部类的一种特殊形式,它没有类名,常用于一次性创建的对象,特别是在需要实现一个接口或继承一个类,但又不需要额外的方法时...
Java 中的内部类和匿名类 Java 中的内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在 C++ 里也有,那就是嵌套类(Nested Class)。内部类从表面上看,就是在类中又定义了一个类,而实际上并没有那么...
Java内部类主要包括以下几种类型:成员内部类(非静态内部类)、静态内部类(也称为静态嵌套类)、局部内部类和匿名内部类。 - **成员内部类**:这种类型的内部类是定义在外部类的一个成员位置上,它可以访问外部类...
Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...
- 内部类可以用于事件处理,比如 Swing 中的监听器,通过匿名内部类快速实现功能。 - 创建特定环境下的对象,如线程、定时任务等。 总之,Java 内部类提供了一种强大的工具,可以增强代码的封装性和可读性,同时...
总结来说,匿名内部类是Java编程中一种强大的工具,它允许开发者快速实现接口,简化代码,特别是在需要事件处理或访问外部类私有成员的场景下。在Android开发中,匿名内部类经常用于创建自定义的`OnClickListener`、...
匿名内部类可以使用在外部类的方法和构造方法中。 内部类是Java语言中的一种特殊类别,它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和...
在Java中,匿名内部类是没有名字的类,它可以直接继承一个类或实现一个接口。在Android中,由于大部分事件处理都是基于接口实现的,如OnClickListener、OnCheckedChangeListener等,因此我们通常会用匿名内部类来...
内部类分为四类:非静态成员内部类、静态成员内部类、局部内部类和匿名内部类。接下来将逐一介绍这四种类型的内部类。 #### 二、非静态成员内部类 非静态成员内部类是最常见的一种内部类形式,它具有以下特点: 1...
匿名内部类是在没有名称的情况下定义的内部类,通常用于快速实现接口或继承类的简单情况。它们常用于事件监听器和回调机制中,可以简化代码,但不能包含任何静态声明。 5. **内部类的作用**: - **多态性增强**:...
通过以上内容,我们可以看到Java中的匿名对象和匿名内部类都是十分实用的功能。匿名对象简化了代码,使我们能够更灵活地处理临时对象的需求;而匿名内部类则为我们提供了一种简洁的方式去实现接口或继承类,尤其是在...
以下是关于Java匿名内部类的详细总结: 1. **继承父类的匿名内部类**: 当你需要创建一个类的对象,而这个类只有一个方法需要实现时,可以使用匿名内部类。例如,`abstract class Person` 定义了一个抽象方法 `eat...
匿名内部类是Java中的一种特殊类,它没有名称,可以直接实例化,并且可以继承一个类或实现一个(多个)接口。在接口回调的场景下,我们可以使用匿名内部类快速地创建一个实现了接口的实例,而无需定义一个新的类。...
总结一下,内部类、匿名内部类和内部接口在Java编程中提供了一种强大的工具,它们可以帮助我们更好地组织代码,实现封装和模块化。在Android开发中,它们常用于事件监听、线程管理、回调函数等场景,增强了代码的...