2017-07-28 70 views
3

下面是编译成功的程序,但是如何访问m1()方法内的类B的m2()方法的A级。如何访问位于Java中另一个类的另一个方法内部的类中的方法

class A{ 
    public void m1() 
    { 
     System.out.println("A-m1"); 
     class B{ 
      public void m2() 
      { 
       System.out.println("B-m2"); 
      } 
     }//end of class B 
    }//end of m1() method 
}// end of class A 
+0

你想从哪里访问它? –

+0

最后,一个很好的问题。我完全错误的前期 - 因为我本人不知道*本地*类自己 - 虽然他们与java8添加。所以,我的投票提出了一个问题,让我今天有所学习。对于我必须对我的答案进行更新的很多事情感到抱歉。 – GhostCat

回答

3

这一切都取决于范围。如果你想在m1()的末尾调用m2(),就像创建一个B的新实例并调用该方法一样简单。

new B().m2() 

如果你想在方法之外或声明之前调用它,它将不会允许你因为范围。

如果是这样的话,您应该考虑将其范围提升到课程级别。

2

简单:你不能在班级之外(当然,不是以一种合理的方式)。

B是local类 - 它只存在于该方法的范围内m1()。因此,您可以在只有在该方法内实例化它。所以,在m1()中,你可以做一个简单的B b = new B(),然后调用b.m2()。但是在这种方法之外,没有语法这将允许您“获得”到A.m1().B.m2()

那么,你也可以使用反射来实例化它的外部。你看,损坏类的名字是A $ 1B.class。

因此,您可以使用Class.forName("A$1B")来获得相应的类;然后当你有一个类A的实例时,你可以再次使用反射来实例化该本地类的一个对象。在那个例子中,你可以调用m2() - 再次使用反射。

但是:你甚至不应该尝试来做到这一点。如果需要从其他地方调用B类及其方法m2(),则不要使其成为本地类。让它成为一个内部类,甚至是一个(非公开的)顶级类。

相关问题