欢迎访问宙启技术站
智能推送

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 局部变量;函数内部类不能有静态成员。