Java 内部类如何被外部类调用

class Outer
{
private int size=10;
public class Inner
{
public void doStuff()
{
System.out.println(++size);
}
}
}
public class Test
{
public static void main(String [] args)
{
Outer outer=new Outer();
outer.Inner inner=outer.new Inner();
inner.doStuff();
}
}

为什么我编译上面这个程序,会出现这过错误!
软件包:outer 不存在!

难道内部类不可以这样被外部类调用的吗?
请高手指点!!!

服了你了,能把程序写成这样。一个java文件里可以有多个类,但只能有一个public类,而且这个类必须是外部类,不能是内部类。而且你在Test里实例化inner的方法也不对,inner的类型始终是Outer.Inner,不会因为Outer实例化而变成outer.Inner,只不过编译器还没有报出那里的错误而已。写成这样:

class Outer{
private int size=10;
class Inner{
public void doStuff(){
System.out.println(++size);
}
}
}

public class Test{
public static void main(String [] args){
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.doStuff();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-13
首先,你要搞清楚静态方法跟非静态方法的区别:

非静态方法是跟随着类的生命周期的,当类实例化时,非静态方法跟随着实例化对象产生,实例化对象可以调用类中的非静态方法,当实例化对象结束时,非静态方法也跟着结束。就是说,非静态方法是依附于实例化对象的,它的生命周期就是实例化对象的生命周期。

静态方法是不受制于类的实例化对象的,即静态方法从程序开始运行到最后释放内存结束是一直存在的,它的生命周期就是程序的生命周期。

从以上可知,静态方法调用非静态方法会造成一个问题,就是生命周期的不一致,比如说:程序刚刚开始运行时,类的实例化构造函数还没有执行,这时静态方法是调用不了非静态方法的;或者当实例化对象消亡之后,静态方法也是不能够去调用非静态方法的。

静态方法要想调用非静态方法,必须要通过实例化对象去调用;当然也可以把非静态方法变成静态方法,这样就不存在任何障碍了。

希望我的回答对你能够有所帮助。
第2个回答  2009-07-29
声明必须是"类的内部类"类型, 而实例化是用外部类的实例, 来实现内部类. 也就是说, 应该声明为:
Outer.Inner inner=outer.new Inner();

完整代码:
class Outer
{
private int size=10;
public class Inner
{
public void doStuff()
{
System.out.println(++size);
}
}
}
public class Test
{
public static void main(String [] args)
{
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.doStuff();
}
}
第3个回答  2009-07-29
public class Test
{
public static void main(String[] arsg)
{
OutterClass oc = new OutterClass();
OutterClass.InnerClass ic = oc.new InnerClass();
ic.prt();
}
}

class OutterClass
{
class InnerClass
{
void prt()
{
System.out.println("InnerClass");
}
}
}
第4个回答  2009-07-29
一个文件里只能一个public类,你肯定是代码一起乐,搞的有两个pulic类,当然出错,把你的test类独立出来别写在一个文件里。
相似回答