在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
从种类上说,内部类可以分为四类:成员内部类、静态内部类、匿名内部类、局部内部类。
成员内部类的地位等同于类的属性。在这种定义方式下,成员内部类对象必须依赖外部类对象而存在,即在创建一个成员内部类对象时首先需要创建其外部类对象。并且在成员内部类中不能声明静态方法。
例如:
public class Test {
Test(){
System.out.println("Test的构造方法..");
}
class InnerClass{
InnerClass(){
System.out.println("InnerClass的构造方法..");
}
/*错误这里不能声明静态方法
public static void fn(){
}
*/
}
public static void main(String[] args) {
InnerClass inner = new Test().new InnerClass();
}
}
运行结果:
Test的构造方法..
InnerClass的构造方法..
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类对象的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。 例如:
public class Test {
private int number=100;
private static String name="test";
Test(){
System.out.println("Test的构造方法..");
}
static class InnerClass{
InnerClass(){
System.out.println("InnerClass的构造方法..");
}
//可以定义静态方法
public static void m(){
//System.out.println(number); //错误,不能使用非静态成员变量
System.out.println(name);
}
//也可以定义非静态方法
public void fn(){
//System.out.println(number); //错误,不能使用非静态成员变量
System.out.println(name);
}
}
public static void main(String[] args) {
InnerClass inner = new Test.InnerClass();
}
}
运行结果:
InnerClass的构造方法..
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
==注意:局部内部类如果要去访问局部变量,那么局部变量默认已经被声明为final类型了。因此局部内部类的成员方法不能修改外部方法体定义的局部变量。==
例如:
public class Test {
Test(){
System.out.println("Test的构造方法..");
}
public static void main(String[] args) {
int number = 100; //number已经默认被声明为final,等同于 final int number = 100;
class InnerClass {
InnerClass(){
System.out.println("InnerClass构造方法...");
}
public void fn(){
//System.out.println(number++); //错误,因为number是final的,不能修改.
System.out.println(number);
}
}
InnerClass inner = new InnerClass();
inner.fn();
}
}
匿名的内部类,就是没有名字的类去实现了某个接口或者某个抽象类。匿名内部类通常也是以局部内部类的形式出现的。 例如:
interface MyInterface{
void fn();
}
public class Test {
Test(){
System.out.println("Test的构造方法..");
}
public static void main(String[] args) {
MyInterface inter = new MyInterface() {
@Override
public void fn() {
System.out.println("我实现了fn()...");
}
};
inter.fn();
}
}
运行结果:
我实现了fn()...
如果匿名内部类实现了一个函数式接口,我们也可以使用Lambda表达式实现。例如:
interface MyInterface{
void fn();
}
public class Test {
Test(){
System.out.println("Test的构造方法..");
}
public static void main(String[] args) {
MyInterface inter = ()->System.out.println("我实现了fn()...");
inter.fn();
}
}
运行结果:
我实现了fn()...
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。其中局部内部类和匿名内部类在实际开发中使用频率较高。