3
abstract class MyClass{

    static class StaticClass{
        public void showAdd(){
            System.out.println(" show add");
        }
    }
}

public class SampleClass extends MyClass{

    public static void main(String[] args){
         MyClass myClass = new SampleClass();
         MyClass.StaticClass staticClass = new MyClass.StaticClass();
         staticClass.showAdd();
    }
}

输出如预期的那样正确,但我们如何用抽象类编写新的?

4

5 回答 5

5

您不是在抽象类上做new,而是在这个抽象类中存在的内部类上做。在这种情况下,抽象类充当命名空间。

于 2012-07-10T17:38:27.777 回答
1

您不能实例化抽象类。您的示例“有效”,因为您并没有真正实例化抽象类。

MyClass myClass = new SampleClass();

SampleClass 是 MyClass 类的子类和实现,因此它不是抽象的。所以这条线可以正常工作。尝试替换new SampleClass()new MyClass(),你会得到一个编译器错误。

MyClass.StaticClass staticClass = new MyClass.StaticClass();

在这种情况下与以下内容相同:

StaticClass staticClass = new StaticClass();

只是在抽象类中声明的内部类的实例化。由于这个内部类不是抽象的,它可以被实例化。

于 2012-07-10T17:55:50.423 回答
0

您不能为抽象类创建实例(除非您使用反射)。所以,如果你这样做new MyClass(),那么只有编译时错误。否则它工作正常,你的例子就是这种情况。

您没有使用为静态类创建实例 new MyClass.StaticClass();

抽象类是没有完全实现的类(一些事实留给子类)。阅读本文档以及内部类如何工作

静态内部类就像类的静态变量。

于 2012-07-10T17:36:16.300 回答
0

试试这个...

1.外部类对其内部类的占有欲非常强(无论是静态的还是非静态的)。

2.所以要访问内部类(静态或非静态)需要外部类。

例如:

Outer.Inner i = new Outer.Inner(); 

在上面的例子中,我没有初始化外部类,而且在你的例子中它是抽象的,所以它没有被初始化的问题,但是它的内部静态类,也称为顶级类被初始化。

于 2012-07-10T18:19:04.397 回答
-1

抽象类不能被实例化!这就是Java规则。

于 2012-07-10T17:37:17.587 回答