Java 中本地内部 类 中的访问方法

Access methods within local inner classes in Java

有什么方法可以访问 Java 中局部内部 类 的方法吗?以下代码是我之前尝试过的示例代码。据此,访问 mInner() 方法的机制是什么?

class Outer{
    int a=100;

    Object mOuter(){
        class Inner{
            void mInner(){
                int y=200;
                System.out.println("mInner..");
                System.out.println("y : "+y);
            }
        }
        Inner iob=new Inner();  
        return iob;
    }
}   
class Demo{
    public static void main(String args[]){
        Outer t=new Outer();
        Object ob=t.mOuter();
        ob.mInner(); // ?need a solution..
    }
}

local class 的作用域规则与变量的作用域规则几乎相同,即它被限制在封闭块内。

与无法从 main 访问变量 iob 的方式相同,您无法从 main.

访问本地 class Inner

在封闭块之外,本地 class 和匿名 class 之间没有区别。两者都无法访问。不同之处在于 封闭块中,本地 class 可以通过名称访问,如果您需要重复访问它特别有用,例如创建多个实例。

与封闭块外的 local/anonymous class 交互的唯一方法是通过任何超级 class 或相关 class 实现的接口。

正如 ILikeTau 的评论所说,您无法访问您在方法中定义的 class。您可以在方法之外定义它,但另一种可能性是定义一个 interface(或抽象 class)。然后代码仍然在你的方法中,并且可以访问方法中定义的 final 变量和参数(如果你将整个 class 移到外面,你就不能这样做)。类似于:

class Outer {
    int a = 100;

    public interface AnInterface {
        void mInner();  // automatically "public"
    } 

    AnInterface mOuter() {   // note that the return type is no longer Object
        class Inner implements AnInterface {
            @Override
            public void mInner() {    // must be public
                int y = 200;
                System.out.println("mInner..");
                System.out.println("y : " + y);
            }
        }
        Inner iob = new Inner();  
        return iob;
    }
}   

class Demo {
    public static void main(String[] args) {  // the preferred syntax
        Outer t = new Outer();
        Outer.AnInterface ob = t.mOuter();
        ob.mInner(); 
    }
}

注:未测试

请注意,return 类型和 ob 类型已从 Object 更改。那是因为在 Java 中,如果你将某物声明为 Object,你只能访问为 Object 定义的方法。编译器必须在编译时(而不是在 运行 时)知道你的对象 ob 有一个 mInner 方法,并且它不能告诉它是否唯一知道的是这是一个 Object。通过将其更改为 AnInterface,编译器现在知道它有一个 mInner() 方法。

要访问内部 class 创建内部对象 class..

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

来自你的例子

outer t=new outer();

outer.inner inner1=t.new inner();

希望这对你有帮助...