有没有办法在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..
}
}
答案 0 :(得分:5)
正如ILikeTau的评论所说,您无法访问您在方法中定义的类。您可以在方法之外定义它,但另一种可能性是定义interface
(或抽象类)。然后代码仍然在您的方法中,并且可以访问方法中定义的final
变量和参数(如果您将整个类移到外面,则无法执行此操作)。类似的东西:
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();
}
}
注意:未经过测试
请注意,返回类型和ob
的类型已从Object
更改。这是因为在Java中,如果您声明某些内容为Object
,则只能访问为Object
定义的方法。编译器必须在编译时(不是在运行时)知道对象ob
具有mInner
方法,并且它不能告诉它,如果它唯一知道的是它&& #39;是Object
。通过将其更改为AnInterface
,编译器现在知道它具有mInner()
方法。
答案 1 :(得分:0)
本地类的范围规则与变量的范围规则几乎相同,也就是说,它仅限于封闭块。
您无法从iob
访问变量main
,但无法从Inner
访问本地课程main
。
在封闭区块之外,本地类和匿名类之间没有区别。两者都无法访问。不同之处在于在的封闭块中,可以通过名称访问本地类,如果您需要重复访问它,尤其有用,例如:创建多个实例。
与封闭块之外的本地/匿名类进行交互的唯一方法是通过相关类实现的任何超类或接口。
答案 2 :(得分:-1)
要访问内部类,请创建内部类的对象..
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
来自你的例子
outer t=new outer();
outer.inner inner1=t.new inner();
希望这可以帮助你...