A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

曹玉龙

中级黑马

  • 黑马币:1

  • 帖子:99

  • 精华:0

本帖最后由 曹玉龙 于 2013-3-12 20:59 编辑

//外部类
class Outer
{
        //外部类成员函数
        public void method()
        {
          final int x = 2;//局部变量,生命周期短,加上final 保证变量的生命最长
          //内部类
           class Inner
           {
               
          public void show()//成员函数,需要对象调用
                  {
                    System.out.println("inner  show"+x);
                  }
           }
                //定义内部类对象
           Inner i = new Inner();
           //调用内部类方法
           i.show();  
           //调用外部类的function()方法,这里编译失败
           function(i);
        }
        //外部类的function()方法
        public void function(Inner i)
        {
           i.show();
        }
}
//程序入口
class InnerClass3
{
        public static void main(String[] args)
        {
                //定义外部类对象
                Outer o = new Outer();
                //调用外部类方法
                o.method();
        }
}

请高手帮忙看一下,谢谢

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

9 个回复

倒序浏览
  1. class Outer<Inner> {
  2.         final int x = 2;
  3.         public void method() {
  4.                 final int x = 2;
  5.                
  6.                 Inner i = new Inner();
  7.                 i.show();
  8.                 function(i);
  9.         }

  10.         public void function(Inner i) {
  11.                 i.show();
  12.         }
  13.         class Inner {
  14.                 public void show() {
  15.                         System.out.println("inner  show" + x);
  16.                 }
  17.         }
  18. }

  19. class MaxMin {
  20.         public static void main(String[] args) {
  21.                 Outer o = new Outer();
  22.                 o.method();
  23.         }
  24. }
复制代码
朋友你的代码实在是太乱了,我给你整理了一下,可以运行了,我不知道你在想什么,我把你的代码该的可以运行了,结果估计也是你想要的,如果是如此,那么我告诉你,你把内部类定义在了外部类的方法里边,然后又在内部类里边又new了一个这个类本身去调用外部类的另一个一个方法,这个new的类能找到这个方法吗?  你外部类的函数的参数是一个内部类,这个内部类在哪里,在外部类的另一个方法中定义的,你觉得他能找到吗?我不知道你是什么逻辑。我也不知道你想验证什么?给你改了一下。也不知道是不是你想要得结果。希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
//外部类
class Outer
{
        //外部类成员函数
        public void method()
        {
          final int x = 2;//局部变量,生命周期短,加上final 保证变量的生命最长
          //内部类
           class Inner
           {
               
                                  public void show()//成员函数,需要对象调用
                  {
                    System.out.println("inner  show    "+x);
                  }
           }
                //定义内部类对象
           Inner i = new Inner();
           //调用内部类方法
           i.show();  
           //调用外部类的function()方法,这里编译失败
           function(i);
        }
        //外部类的function()方法
        public void function(Inner i)//肉部类外面就不识别,没解决了
        {
           i.show();
        }
}
//程序入口
class InnerClass3
{
        public static void main(String[] args)
        {
                //定义外部类对象
                Outer o = new Outer();
                //调用外部类方法
                o.method();
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Inner是一个局部内部类,局部内部类仅在该方法里有效。
因此你的 public void function(Inner i)这方法不能通过编译。Inner找不到,或者没定义。这里编译通不过,当然 function(i);这句代码同样不能通过编译。

为了让程序正常运行,我修改了一下你的代码:
// 外部类
class Outer {
        // 内部类
        class Inner {
                final int x = 2;// 局部变量,生命周期短,加上final 保证变量的生命最长

                public void show()// 成员函数,需要对象调用
                {
                        System.out.println("inner  show" + x);
                }
        }

        // 外部类成员函数
        public void method() {
                // 定义内部类对象
                Inner i = new Inner();
                // 调用内部类方法
                i.show();
                // 调用外部类的function()方法,这里编译失败
                function(i);
        }

        // 外部类的function()方法
        public void function(Inner i) {
                i.show();
        }
}
public static void main(String[] args) {
                // 定义外部类对象
                Outer o = new Outer();
                // 调用外部类方法
                o.method();
        }

希望对你有所帮助!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
袁见 发表于 2013-3-12 00:27
Inner是一个局部内部类,局部内部类仅在该方法里有效。
因此你的 public void function(Inner i)这方法不能 ...

:handshake谢谢袁兄,但是经你的改动后,局部内部类变成了成员内部类,这样没能解决题目问的局部内部类的问题
回复 使用道具 举报
我的想法是,把局部内部类的对象 i 作为参数传递出去,被外面的其他函数和类使用
回复 使用道具 举报
本帖最后由 门文通 于 2013-3-12 04:50 编辑

你定义的不是局部内部类  是内部类    这不一样   如果是内部类   非静态的话  可以先创建外部类对象  用外部类对象 去调用内部类对象  或调用内部类去创建内部类对象

如果是局部内部类的话   我可看以先建立外部类对象   用外部类对象调用局部内部类所在的方法  得到局部内部类对象  例如

public   Inner  show() //这是外部类的方法
{
       class Inner() //局部内部类
           {


            }
        Inner i=new Inner();  
        return i;   //  返回该对象   在主方法中赋值给一个内部类引用就OK 了
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
曹玉龙 发表于 2013-3-12 00:54
谢谢袁兄,但是经你的改动后,局部内部类变成了成员内部类,这样没能解决题目问的局部内部类的问 ...

好像不能达到你想要的答案吧,因为局部内部类的作用域问题。
public void function(Inner i)在定义方法的时候,无法定义Inner这个类型。
回复 使用道具 举报
Inner是一个局部内部类,局部内部类的作用域仅在它所在的函数内有效,所以当你调用外部类function(i)函数时,因为 public void function(Inner i){ i.show();}的参数是Inner对象,已经超出了它的作用域,所以会出现编译异常,建议你可以使用MyEclipse或者Eclipse工具试试看,会提示你Great class 'Inner',其实就是找不到Inner类,把Inner改成成员内部类就好了,这是我改的:
package com.test;
public class Test11{
public static void main(String[] args) {
                // 定义外部类对象
                Outer o = new Outer();
                // 调用外部类方法
                o.method();
}
}

class Outer {
     
      // 外部类成员函数
      public void method() {
          // 定义内部类对象
          Inner i = new Inner();
          // 调用内部类方法
          i.show();
          // 调用外部类的function()方法,这里编译失败
          function(i);
      }
        // 内部类
class Inner {
    final int x = 2;// 局部变量,生命周期短,加上final 保证变量的生命最长
    public void show()
      {
           System.out.println("inner  show=" + x);
      }
}
        // 外部类的function()方法
        public void function(Inner i) {
                i.show();
        }
}
回复 使用道具 举报
      大家对出错的原因给出了解释,内部类的作用域使它无法直接被外部调用.
      我通过在网上查资料,发现了一种用接口访问局部内部类的方法,下面是这个例子的改造后的代码,供和我一样的新手参考.
这个贴子将设置为"已解决".谢谢大家积极帮忙,版主的加分也是及时的鼓励,.
  1. //供局部内部类使用的接口
  2. interface MyInner
  3. {
  4.         public abstract void show();
  5. }
  6. //外部类
  7. class Outer
  8. {
  9.         //外部类成员函数
  10.         public MyInner method()
  11.         {
  12.           //局部变量,生命周期短,加上final 保证变量的生命最长
  13.           final int x = 2;
  14.           //局部内部类,实现MyInner
  15.            class Inner implements MyInner
  16.            {
  17.           public void show()
  18.                   {
  19.                     System.out.println("inner  show"+x);
  20.                   }
  21.            }
  22.                 //多态
  23.            MyInner i = new Inner();
  24.            //调用Outer的function()方法
  25.            function(i);
  26.            //返回i对象
  27.            return i;          
  28.         }
  29.         //Outer的function()方法
  30.         public void function(MyInner i)
  31.         {
  32.            i.show();
  33.         }
  34. }
  35. //程序入口
  36. class InnerClass3
  37. {
  38.         public static void main(String[] args)
  39.         {
  40.                 //定义外部类对象
  41.                 Outer o = new Outer();
  42.                 //调用内部类方法
  43.                 o.method().show();
  44.         }
  45. }

  46. //结果:打印出两行inner  show2
  47. //结论:通过接口实现了外部类和外部函数访问内部类
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马