黑马程序员技术交流社区

标题: 关于局部内部类小问题 [打印本页]

作者: 张洪慊    时间: 2013-4-1 20:52
标题: 关于局部内部类小问题
本帖最后由 张洪慊 于 2013-4-1 22:19 编辑
  1. interface Inter{

  2.   public abstract void function();

  3. }



  4. //外部类
  5. class Outer{
  6.   
  7.    public Inner method(){ //如果改成Inter(父类引用,则正常)
  8.     final int a=3;   
  9.         //局部内部类
  10.           class Inner implements Inter{
  11.         
  12.                          public void function(){
  13.                           
  14.                           System.out.println("a= "+a);
  15.         
  16.            }
  17.         
  18.          }
  19.     return new Inner();
  20.    
  21.   }

  22. }

  23. class FinalVariable{

  24.    public static void main(String[] args){
  25.   
  26.      Outer out=new Outer();
  27.          
  28.          out.method().function();
  29.      
  30.     /*
  31.          // 如果上面改成父类引用,则没问题
  32.          Inter in=out.method();
  33.          in.function();
  34.         */
  35.    }


  36. }
复制代码

为什么会报 不兼容类型??找不到function又是为什么?
返回父类引用都可以,而局部内部类自身引用却不行?
拜托详细解释下.
作者: 李尧    时间: 2013-4-1 21:06
我想应该是这里的问题 写在注释里了.
  1. class Outer
  2. {
  3.    public Inner method()//定义这个方法时还没有Inner这个类,如何返回Inner类型?
  4.    {
  5.            final int a=3;   
  6.        class Inner implements Inter//这时Inner才刚刚被定义
  7.        {
  8.             public void function()
  9.             {
  10.               System.out.println("a= "+a);
  11.             }
  12.         
  13.         }
  14.                return new Inner();
  15.     }
  16. }

  17. class FinalVariable
  18. {
  19.    public static void main(String[] args)
  20.    {
  21.      Outer out=new Outer();
  22.      out.method().function();//所以method这个方法是有问题的.
  23.    }
  24. }
复制代码

作者: 黑马19我最牛    时间: 2013-4-1 21:07
12行那里,对于method()  这个方法的返回值,根本都没有inner这个类,你怎么返回这个类的类型的值.在编译的时候,方法内部是不运行的,他根本就不知道这个类!
作者: 王亚东    时间: 2013-4-1 21:10
jvm编译时是从上到下一行一行的编译,他不认识Inner(Inner类是在下面定义的)
作者: 张洪慊    时间: 2013-4-1 21:10
本帖最后由 张洪慊 于 2013-4-1 21:11 编辑
许兵兵 发表于 2013-4-1 21:07
12行那里,对于method()  这个方法的返回值,根本都没有inner这个类,你怎么返回这个类的类型的值.在编译的时 ...

关于这一点,我也考虑到了,再看一个例子假如我下面自定义一个Person类:
  1. interface Inter{

  2.   public abstract void function();

  3. }



  4. //外部类
  5. class Outer{
  6.   
  7.    public Person method(){ //如果改成Inter(父类引用,则正常)
  8.     final int a=3;   
  9.         //局部内部类
  10.           class Inner implements Inter{
  11.         
  12.                          public void function(){
  13.                           
  14.                           System.out.println("a= "+a);
  15.         
  16.            }
  17.         
  18.          }
  19.     //return new Inner();
  20.     return new Person();
  21.   }

  22. }
  23. class Person
  24. {

  25. }

  26. class FinalVariable{

  27.    public static void main(String[] args){
  28.   
  29.      Outer out=new Outer();
  30.          
  31.          //out.method().function();
  32.      out.method();
  33.     /*
  34.          // 如果上面改成父类引用,则没问题
  35.          Inter in=out.method();
  36.          in.function();
  37.         */
  38.    }


  39. }
复制代码
麻烦各位看看这个例子.
以上可以编译成功,这个跟那个哪里有区别?
作者: 张洪慊    时间: 2013-4-1 21:12
王亚东 发表于 2013-4-1 21:10
jvm编译时是从上到下一行一行的编译,他不认识Inner(Inner类是在下面定义的) ...

麻烦看看下面例子
作者: 张洪慊    时间: 2013-4-1 21:12
李尧 发表于 2013-4-1 21:06
我想应该是这里的问题 写在注释里了.

麻烦看看下面例子
作者: 黑马19我最牛    时间: 2013-4-1 21:13
张洪慊 发表于 2013-4-1 21:10
关于这一点,我也考虑到了,再看一个例子假如我下面自定义一个Person类:麻烦各位看看这个例子.
以上可以编译 ...

第29行到第30行定义了一个person类,因此这个类你可以用.而上面的那个inner在你没有定义之前是不能用的!
作者: 张洪慊    时间: 2013-4-1 21:18
许兵兵 发表于 2013-4-1 21:13
第29行到第30行定义了一个person类,因此这个类你可以用.而上面的那个inner在你没有定义之前是不能用的! ...

有点乱,能不能帮我详细解释下程序执行顺序,或类加载顺序?
作者: 张洪慊    时间: 2013-4-1 21:22
王亚东 发表于 2013-4-1 21:10
jvm编译时是从上到下一行一行的编译,他不认识Inner(Inner类是在下面定义的) ...

我在想,如果找不到Inner,它应该报找不到符号?(可以简单测试下),报不兼容类型令我费解,
麻烦考虑下.
作者: 王亚东    时间: 2013-4-1 21:25
Person是个单独的类,可以被编译,而Inner作为内部类,如果他的外部类都无法编译通过,那么他也无法被编译,
也就是说,当你要使用一个i类型时,这个类型要事先存在才行。
作者: 李尧    时间: 2013-4-1 21:37
张洪慊 发表于 2013-4-1 21:12
麻烦看看下面例子

person是你在外部单独定义的一个类,在定义Outer类的method方法时Person已经存在所以编译没问题.
作者: 张洪慊    时间: 2013-4-1 21:38
王亚东 发表于 2013-4-1 21:25
Person是个单独的类,可以被编译,而Inner作为内部类,如果他的外部类都无法编译通过,那么他也无法被编译 ...

我好相明白了,原因是 在使用内部类之前 一定会先创建外部类对象,
或者说初始化外部类,method方法应该先于Inner加载..报兼容类型有点小郁闷..为什么不报 找不到符号(找不到类)..
唉,看来内存方面还是欠缺..
作者: 张洪慊    时间: 2013-4-1 21:41
李尧 发表于 2013-4-1 21:37
person是你在外部单独定义的一个类,在定义Outer类的method方法时Person已经存在所以编译没问题. ...

嗯,同学,再麻烦下它为什么不报 找不到符号?(找不到Inner),而报不兼容类型,有点小郁闷.(我是不是钻牛角尖了....)
作者: 李尧    时间: 2013-4-1 21:46
张洪慊 发表于 2013-4-1 21:41
嗯,同学,再麻烦下它为什么不报 找不到符号?(找不到Inner),而报不兼容类型,有点小郁闷.(我是不是钻牛角尖 ...

我是这么理解的:
在method方法return时,因为已经定义了内部类Inner,编译器知道有这个类.然后在方法上的那个返回值类型Inner编译器不认识,也就是说是一个未知的类.Inner cannot be resolved to a type.  那么这两个类型,编译器就认为不兼容了吧...
写得有点乱,不知道卤煮明白我的意思么....
作者: 张洪慊    时间: 2013-4-1 21:54
李尧 发表于 2013-4-1 21:46
我是这么理解的:
在method方法return时,因为已经定义了内部类Inner,编译器知道有这个类.然后在方法上的那 ...

我凌乱了,,,呵呵,你的意思我大致能理解,感觉有点牵强.
唉,话说现在还没玩到Eclipse,没调试很不爽...你可以用调试 弄弄..
我现在恨不得是那个编译器...

谢了,别想了, 随着知识深入,慢慢理解更透彻吧.





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2