Java函数内部类的用法及注意事项
发布时间:2023-06-22 13:48:46
Java中的函数内部类是指一个类定义在另一个类的方法内部,它只在该方法内部可见,所以被称为局部内部类。以下是函数内部类的用法和注意事项:
1. 函数内部类的定义格式
下面是一个函数内部类的定义格式:
public class OuterClass {
public void method() {
class InnerClass {
// ...
}
}
}
2. 函数内部类的使用
函数内部类主要用于在方法内部创建一个辅助类,帮助我们完成一些复杂的逻辑。函数内部类可以访问外部类的成员变量和方法,同时也可以访问方法内的局部变量。例如:
public class OuterClass {
public void method() {
final int num = 10;
class InnerClass {
public void printNum() {
System.out.println(num);
}
}
InnerClass inner = new InnerClass();
inner.printNum();
}
}
在上面的例子中,函数内部类InnerClass可以访问方法内的局部变量num,并打印出它的值。
3. 函数内部类的注意事项
1)函数内部类只能被声明为 final 或者是 abstract 。这是因为函数内部类访问的局部变量必须是 final 的,而如果没有被声明为 final ,则在方法执行完成后它的值可能会发生改变,这就会导致函数内部类的行为变得不可预测。
public class OuterClass {
public void method() {
int num = 10;
// Error: Local variable num defined in an enclosing scope must be final or effectively final
class InnerClass {
public void printNum() {
System.out.println(num);
}
}
InnerClass inner = new InnerClass();
inner.printNum();
}
}
2)函数内部类不能有静态成员。因为函数内部类只能在方法内部访问,静态成员只能在类级别访问所以会产生矛盾。
public class OuterClass {
public void method() {
int num = 10;
// Error: Inner classes cannot have static declarations
static class InnerClass {
public void printNum() {
System.out.println(num);
}
}
InnerClass inner = new InnerClass();
inner.printNum();
}
}
3)函数内部类不可以访问它所在方法的非 final 局部变量。
public class OuterClass {
public void method() {
int num = 10;
String str = "hello";
// Error: Local variable str defined in an enclosing scope must be final or effectively final
class InnerClass {
public void printNum() {
System.out.println(num);
System.out.println(str);
}
}
InnerClass inner = new InnerClass();
inner.printNum();
}
}
4)函数内部类可以实现接口或继承抽象类。
public class OuterClass {
public void method() {
abstract class InnerClass {
public abstract void printNum();
}
class ConcreteInnerClass extends InnerClass {
public void printNum() {
System.out.println("ConcreteInnerClass.printNum");
}
}
InnerClass inner = new ConcreteInnerClass();
inner.printNum();
}
}
总结:
函数内部类主要用于在方法内部创建一个辅助类,帮助我们完成一些复杂的逻辑。它可以访问外部类的成员变量和方法,同时也可以访问方法内的局部变量。但是需要注意:函数内部类只能被声明为 final 或者是 abstract ;函数内部类不可以访问它所在方法的非 final 局部变量;函数内部类不能有静态成员。
