一、Java内部类是什么
Java内部类是指定义在另一个类中的类。内部类可以访问包含它的外部类的所有变量和方法,包括私有变量和方法。内部类也可以用来实现一些设计模式,比如单例模式和工厂模式等。
二、Java内部类的分类
Java内部类可以分为四种类型:成员内部类、方法内部类、匿名内部类和静态内部类。
1. 成员内部类
成员内部类是最常用的一种内部类。它的定义方式如下:
public class Outer { private int x; public class Inner { public void print() { System.out.println("x = " + x); } } }
通过编译器自动生成的类名可以看出,成员内部类是和外部类关联在一起的。这也就意味着,成员内部类可以用来访问外部类的所有成员变量和方法。
2. 方法内部类
方法内部类只能在定义该内部类的方法中使用,它的定义方式如下:
public class Outer { private int x; public void print() { class Inner { public void display() { System.out.println("x = " + x); } } Inner inner = new Inner(); inner.display(); } }
方法内部类只能在定义它的方法中使用,也就是说,方法内部类的作用范围被限制在了方法内部。
3. 匿名内部类
匿名内部类是一种没有类名的内部类。它的定义方式比较特殊,通常用来实现接口或者抽象类中的方法,如下所示:
interface Person { void sayHello(); } public class Outer { public void sayHello() { new Person() { public void sayHello() { System.out.println("Hello World!"); } }.sayHello(); } }
匿名内部类的特点是没有类名,并且它是在声明时直接定义的。这也使得它只能在定义它的地方使用。
4. 静态内部类
静态内部类是定义在类内部的一个静态类。它的定义方式如下:
public class Outer { private static int x; public static class Inner { public void print() { System.out.println("x = " + x); } } }
由于静态内部类是静态的,所以它可以直接访问外部类的静态变量和静态方法。
三、Java内部类的优缺点
Java内部类相比于普通类,有如下优缺点:
1. 优点
- 内部类可以访问外部类的私有变量和方法,这样可以保证程序的安全性。
- 内部类可以实现一些设计模式,比如单例模式和工厂模式等。
- 内部类可以提高代码的可读性和可维护性。
2. 缺点
- 内部类会增加程序的复杂度。
- 内部类会增加程序的运行时间和内存消耗。
- 内部类的作用域只限于包含它的类,这可能会导致代码复用性不高。
四、Java内部类的代码示例
1. 成员内部类示例
public class Outer { private int x; public class Inner { public void print() { System.out.println("x = " + x); } } public void execute() { Inner inner = new Inner(); inner.print(); } }
2. 方法内部类示例
public class Outer { private int x; public void print() { class Inner { public void display() { System.out.println("x = " + x); } } Inner inner = new Inner(); inner.display(); } }
3. 匿名内部类示例
interface Person { void sayHello(); } public class Outer { public void sayHello() { new Person() { public void sayHello() { System.out.println("Hello World!"); } }.sayHello(); } }
4. 静态内部类示例
public class Outer { private static int x; public static class Inner { public void print() { System.out.println("x = " + x); } } }