黑马程序员技术交流社区

标题: 内部类问题 [打印本页]

作者: 张榆    时间: 2012-9-16 20:44
标题: 内部类问题
本帖最后由 张榆 于 2012-9-16 22:50 编辑

一个内部类抽象了,那么是什么样的子类可以继承它?

作者: 武庆东    时间: 2012-9-16 21:05
内部类实际上是作为外部类的数据成员来实现的。
内部抽象类的多重实现可以看做是把一个抽象类(二级内部抽象类)定义为一个抽象类(一级内部抽象类)的一个数据成员,这是可以实现的。
继承内部类的抽象类,同时也就是继承内部类的外部类,同时也继承外部类的数据成员,这样就必须需实现外部类的内部抽象类成员,和继承一般类一样继承类,并实现内部抽象类!
作者: 张榆    时间: 2012-9-16 21:14
武庆东 发表于 2012-9-16 21:05
内部类实际上是作为外部类的数据成员来实现的。
内部抽象类的多重实现可以看做是把一个抽象类(二级内部抽 ...

我说的是其它外部类来继承这个抽象内部类,怎么继承?
作者: 张榆    时间: 2012-9-16 21:21
张榆 发表于 2012-9-16 21:14
我说的是其它外部类来继承这个抽象内部类,怎么继承?

哦  我知道了
子类如果想继承抽象内部类,就必须在这个类中定义一个带有外部类对象的构造方法,并在构造方法中调用外部类.super();


谢谢
作者: 夏天    时间: 2012-9-16 21:27
本帖最后由 夏诗瑶 于 2012-9-16 21:43 编辑

//首先,内部类其实就是一个子类对象
//其实内部类的出现,在一定意义上实现了多继承。因为内部类 可以有多个,分别继承别的类。外部类也可以用内部类里的方法了。
//然后,关于你的问题。子类如果想继承抽象内部类,就必须在这个类中定义一个带有外部类对象的构造方法,并在构造方法中调用外部类.super();

代码如下:
class Outer {
abstract class Inner {
  abstract void show();
  public void print() {
  }
}
}
class Test extends Outer.Inner {// 如果不这么继承,必须导入Inner类的包。
Test(Outer out) {
  out.super();
}
@Override
void show() {
}
}

作者: 武庆东    时间: 2012-9-16 22:20
示例代码:
class AbstractTest {  //这里类修饰符可以使用abstract 修饰
    static abstract class A{
   /* A作为抽象类,那么static 必须保留,做为类静态成员变量。 A内部类,为外部类AbstractTest 的一个成员属性,随着对象的创建而加载,不能直接调用内部类,要调用只能new AbstractTest ().A。要想继承的话,只能把内部类改成静态内部类,static abstract class A {},此时对着类的加载而加载。*/
        abstract void say();
        }
   
      void c(){
       System.out.println("sss");
       }

}
class B extends AbstractTest.A{
     public static void main(String[] args){

}

    @Override
    void say() {
        // TODO Auto-generated method stub
        }
}
重点:非静态内部类,伴随着类的实例化开辟内存单元。 A抽象内部类,为外部类AbstractTest 的一个成员属性,随着对象的创建而加载,不能直接调用内部类,要调用只能new AbstractTest ().A。要想继承的话,只能把内部类改成静态内部类,static abstract class A {},此时对着类的加载而加载。





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