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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 牛杨 于 2012-8-6 10:08 编辑

                                       问题已经解决
练习写了个小程序,发现了一个不能解决的错误,喜欢老少爷们儿们能够帮小弟一把。{:soso_e183:}。
class Outer
{
       int a=90;
       public abstract class InnerAbs
      {
            int b=80;
            abstract void inAbs();
      }
}
class AA extends Outer.InnerAbs
{
      void inAbs()
     {
           System.out.println("AA……inAbs");
     }
}
class Main
{
      public static void main(String[] args)
      {

      }
}
---------- javac ----------
Main.java:11: 错误: 需要包含Outer.InnerAbs的封闭实例
class AA extends Outer.InnerAbs
^
1 个错误
为什么会产生这样的错误?
能不能修改这个错误,同时还能保证AA能够继承Outer.InnerAbs ?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

11 个回复

正序浏览
佟都 发表于 2012-8-6 23:09
---------- javac ----------
Main.java:11: 错误: 需要包含Outer.InnerAbs的封闭实例
class AA extends Ou ...

哇塞! 这位兄弟好强悍哦,学这么长时间java了 我还是头一次见这么调用super语句的  out.super();   呵呵呵呵 受教了 受教了 佩服佩服啊!你解释的也很清楚,给你点金币花花吧  谢谢!
回复 使用道具 举报
本帖最后由 佟都 于 2012-8-7 20:06 编辑

---------- javac ----------
Main.java:11: 错误: 需要包含Outer.InnerAbs的封闭实例
class AA extends Outer.InnerAbs
^
1 个错误
为什么会产生这样的错误?
能不能修改这个错误,同时还能保证AA能够继承Outer.InnerAbs ?
-----------------------------

编译器的意思是:要创建Outer.InnerAbs的子类对象必须保留一个外部类的引用。

原理如下:
当创建一个子类时,子类构造函数总会调用父类的构造函数,因此在创建
非静态内部类的子类时,必须保证让子类构造函数可以调用非静态内部类
的构造函数,调用非静态内部类的构造函数时,必须存在一个外部类对象,
因为当调用非静态内部类的实例方法时,必须有一个非静态内部类实例,
而非静态内部类实例必须寄存在外部内实例里。


代码可以修改如下:
class Outer
{
       int a=90;
       public abstract class InnerAbs
       {
             int b=80;
             abstract void inAbs();
       }
}

class AA extends Outer.InnerAbs
{
      //显式定义AA(非静态内部类子类)的构造函数
      AA(Outer out)
      {
         out.super();
      }


      void inAbs()
      {
            System.out.println("AA……inAbs");
      }
}

class Main
{
      public static void main(String[] args)
      {
            Outer out = new Outer();
            //非静态内部类子类的创建
            AA aa = new AA(out);

            aa.inAbs();
      }
}


评分

参与人数 1黑马币 +6 收起 理由
牛杨 + 6 很给力!

查看全部评分

回复 使用道具 举报
问题已经解决
回复 使用道具 举报
周坤 发表于 2012-8-6 00:44
class Outer
{
        int a=90;

也就是说 在其他外部类中使用一个非静态的内部类,必须要创建这个内部类对应的外部类的对象! 原来如此,明白了。
回复 使用道具 举报
  1. public static abstract class InnerAbs
复制代码
楼主你看漏了哦,,这里加了static,,然后就可以在主函数里new对象了。
回复 使用道具 举报
class Outer
{
        int a=90;
        public abstract class InnerAbs
       {
             int b=80;
             abstract void inAbs();
       }
}
class AA extends Outer.InnerAbs //InnerAbs内部类,为外部类Outer的一个成员属性,随着对象的创建而加载,不能直接调用内部类,要调用只能new Outer().InnerAbs。要想继承的话,只能把内部类改成静态内部类,public static abstract class InnerAbs{},此时对着类的加载而加载。
{
       void inAbs()
      {
            System.out.println("AA……inAbs");
      }
}
class Main
{
       public static void main(String[] args)
       {

       }
}
不过,静态内部类要遵循静态内部类的条件,即该静态内部类只能直接访问外部类中的静态成员了

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
外部类不能访问内部类 的  把内部类 静态就可以解决啦
回复 使用道具 举报
abstract class Outer
{
       int a=90;
       public static abstract class InnerAbs
      {
            int b=80;
            abstract void inAbs();
      }
}
class AA extends Outer.InnerAbs
{
      void inAbs()
     {
           System.out.println("AA……inAbs");
     }
}
class Main
{
      public static void main(String[] args)
      {
                new AA().inAbs();
      }
}
回复 使用道具 举报
牛杨 发表于 2012-8-6 00:32
兄弟 只是在主函数里面定义个匿名对象,我刚才试了试好像不行啊?

public static abstract class InnerAbs
回复 使用道具 举报
黑马振鹏 发表于 2012-8-6 00:28

兄弟 只是在主函数里面定义个匿名对象,我刚才试了试好像不行啊?
回复 使用道具 举报
  1. class Outer1
  2. {
  3.        int a=90;
  4.        public static abstract class InnerAbs
  5.        {
  6.              int b=80;
  7.              abstract void inAbs();
  8.        }

  9. }
  10. class AA extends Outer1.InnerAbs
  11. {
  12.       void inAbs()
  13.      {
  14.            System.out.println("AA……inAbs");
  15.      }
  16. }
  17. class Main
  18. {
  19.       public static void main(String[] args)
  20.       {
  21.               new AA();

  22.       }
  23. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马