class InnerTest{
InCls ic = null;
int k = 3;
public InnerTest(){
}
public InnerTest(InCls ic){
this.ic = ic;
}
public int add(int a,int b){
System.out.println("外部类的add方法");
return a+b;
}
public int add(int a,int b,int c){
return ic.add(ic.add(a, b),c);
}
class InCls{
int m = add(2,4);
int h = InnerTest.this.add(10, 4);
public InCls(){
}
public int add(int a,int b){
System.out.println("内部类的add方法");
return a*b;
}
}
}public class InnerCls {

public static void main(String args[]){
int a = 3,b=6,c=5;
InnerTest it = new InnerTest();
InnerTest.InCls iic = it.new InCls();
InnerTest intt = new InnerTest(iic);
System.out.println(iic.m);
}
}
输出是:内部类的add方法
外部类的add方法
8

解决方案 »

  1.   

    我能,但你要先把代码贴好。1、将代码进行良好的格式化,以方便阅读。
    2、在发帖文本框的上方单击“#”按钮,选择 Java
    3、将代码粘贴到【code=Java】和【/code】之间。发出来的帖子就会是下面的效果:public class Hello {    // 程序入口
        public static void main(String[] args) {
            System.out.println("Hello!");
        }
    }
      

  2.   

    当运行程序并激活方法时,JRE System会检查实际对象的数据类型,并使用来自该类型的方法.内部类也一样.会优先内部类的方法,再去外部类找.(观察所得,不可尽信)
    内部类的add方法 是初始化m时输出.所以m是8
    外部类的add方法 是初始化h时输出,因为已经给定了外部类的引用.h是14
      

  3.   

    我帮楼主个忙吧!!
    class InnerTest {
    InCls ic = null;
    int k = 3; public InnerTest() {
    } public InnerTest(InCls ic) {
    this.ic = ic;
    } public int add(int a, int b) {
    System.out.println("外部类的add方法");
    return a + b;
    } public int add(int a, int b, int c) {
    return ic.add(ic.add(a, b), c);
    } class InCls {
    int m = add(2, 4);
    int h = InnerTest.this.add(10, 4); public InCls() {
    } public int add(int a, int b) {
    System.out.println("内部类的add方法");
    return a * b;
    }
    }
    }public class InnerCls { public static void main(String args[]) {
    int a = 3, b = 6, c = 5;
    InnerTest it = new InnerTest();
    InnerTest.InCls iic = it.new InCls();
    InnerTest intt = new InnerTest(iic);
    System.out.println(iic.m); }
    }
      

  4.   

    LZ看看这个。
    http://aoyi.javaeye.com/blog/361694
      

  5.   

    InnerTest.InCls iic = it.new InCls();//创建了内部类的对象iic
    InnerTest intt = new InnerTest(iic);//调用了外部类的带参数的构造方法,此时将内部类对象iic传入赋值给外部类中的ic属性(这里ic是内部类的对象的引用,它也是外部类的一个属性)
    然后,既然创建了内部类的对象,那么自然一下这两句话就要执行
    int m = add(2, 4);
    int h = InnerTest.this.add(10, 4);
    所以这是先条用了内部类中的add方法!此时m=8
    然后条用了外部类的add方法,m是内部类的属性,所以打印icc.m自然等于8不要被外部类的其他方法所干扰!比如
     public int add(int a, int b, int c) {
            return ic.add(ic.add(a, b), c);
        }
    这个防范根本没有执行过!!!
    这是我的答案,如果有错误请指正!!
      

  6.   

    InnerTest.InCls iic = it.new InCls(); 
    //创建内部类实例,int m = add(2, 4); 被执行,调用内部类自己的add方法,输出 内部类的add方法,此时iic.m=8
    //然后int h = InnerTest.this.add(10, 4); 被执行,调用外部类的add方法,输出 外部类的add方法,此时iic.h=14
    InnerTest intt = new InnerTest(iic); 
    System.out.println(iic.m); //iic.m=8,所以这里输出8
      

  7.   

    System.out.println(iic.m);
    iic.m执行的是内部类中的m = add(2, 4);结果就是
    内部类的add方法 和8;
    之后又执行了h = InnerTest.this.add(10, 4)
    调用外部类的add方法,结果是
    外部类的add方法,14 
    所以结果就是
    内部类的add方法
    外部类的add方法 
    8