Java 中的内部类有什么用?
文章目录
什么是内部类
把类定义在另一个类的内部,该类就被称为内部类.
非常重要的一点是,内部类能够访问外部类的所有成员,包括private修饰的.
为什么需要内部类
Java的内部类让我很容易的想起来JavaScript的闭包,闭包就是定义在一个函数内部的函数——这听起来和Java的内部类定义一样一样的.
本质上,闭包是将函数内部与函数外部连接起来的桥梁.
内部类一样,它是将内部类与外部类连接起来的桥梁.
内部类有何优势
- 内部类可以直接访问外部类中的成员(包括私有成员),
- 内部类可以独立地继承一个抽象类或者实现一个接口,无论外部类是否也这样做了,对内部类都没有影响.
- 可以模拟实现多继承
我们知道C++中是多继承,java是单继承,利用内部类我们可以模拟实现java的多继承
public abstract class F {
}
public abstract class F1 {
}
public Class Outer{
class Fextends extends F{
}
class F1extends extends F1{
}
private F f;
private F1 f1;
}
上面Outer 类简单的实现了多继承.
内部类的分类
静态内部类
被 static 所修饰的内部类,按位置分,属于成员内部类.
但也可以称作静态内部类,也常叫做嵌套内部类.
即使没有外部类对象,也可以创建静态内部类对象,而外部类的非static成员必须依赖于对象的调用,静态成员则可以直接使用类调用,不必依赖于外部类的对象,所以静态内部类只能访问静态的外部属性和方法.
class Outter {
int age = 10;
static age2 = 20;
public Outter() {
}
static class Inner {
public method() {
System.out.println(age);//错误
System.out.println(age2);//正确
}
}
}
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
inner.method();
}
}
上面程序输出结果中,method() 只能访问 age2 变量,因为内部静态类只能访问静态的外部属性和方法.
匿名内部类
一个没有名字的类,是内部类的简化写法
new 类名或者接口名() {
重写方法();
}
本质:其实是继承该类或者实现接口的子类匿名对象
interface Inner {
public abstract void show();
}
class Outer {
public void method(){
new Inner() {
public void show() {
System.out.println("HelloWorld");
}
}.show();
}
}
class Test {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}