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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李芳池 中级黑马   /  2013-4-4 00:58  /  1186 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李芳池 于 2013-4-4 17:45 编辑
  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为什么又找不到?能否通俗易懂解释下

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
当调用method方法的时候,局部内部类才被加载进内存,并返回时进行了实例化,而该方法在外部类加载时就要加载进内存,此时Inner还不存在
回复 使用道具 举报
呵呵 Inner作为局部内部类,是不可以修饰它所在的局部(方法)的。因为method方法没运行的时候,Inner是不存在的。也就是先运行method 才会加载Inner.
在编译的时候,会把程序涉及到的文件编译成class,但由于方法未运行,所以Inner在编译期间是不会被编译成class的,也就是编译器检查语法的时候找不到修饰method的Inner类,自然会报错,说:找不到文件。
回复 使用道具 举报
内部类可以调用父类中的所有方法,如果内部类是静态的则只能调用父类中的静态成员。内部类如果是局部内部类是不能是静态的,因为静态只能修饰成员方法。
如果想创建内部类必修要先有父类对象才可以想创建。
父类名.内部类名  引用名=new 父类名().new 内部类名();

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问; 没有的话,尽量及时将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马