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();
}
}
输出是否符合预期,但我们如何用抽象类写 new ?
答案 0 :(得分:4)
您没有对抽象类执行new
,而是对此抽象类中存在的内部类执行操作。在这种情况下,抽象类充当命名空间。
答案 1 :(得分:1)
您无法实例化抽象类。你的例子“有效”,因为你并没有真正实例化一个抽象类。
MyClass myClass = new SampleClass();
SampleClass是一个子类,是MyClass类的一个实现,因此它不是抽象的。所以这条线只是按照它应该的方式工作。尝试将new SampleClass()
替换为new MyClass()
,您将收到编译错误。
MyClass.StaticClass staticClass = new MyClass.StaticClass();
在这种情况下是相同的:
StaticClass staticClass = new StaticClass();
只是在抽象类中声明的内部类的实例化。由于这个内部类不是抽象的,因此可以实例化它。
答案 2 :(得分:0)
您无法为抽象类创建实例(除非您使用反射)。所以,如果你做new MyClass()
,那么只有编译时错误。否则它工作正常,这是你的例子。
您不是使用new MyClass.StaticClass();
抽象类是未完全实现的类(某些事实留给子类)。阅读此documentation和how inner classes work。
静态内部类类似于类的静态变量。
答案 3 :(得分:0)
试试这个......
1。外类非常占有内部类(无论是静态还是非静态)。
2. 因此,要访问内部类(静态或非静态),需要使用外部类。
<强>例如强>
Outer.Inner i = new Outer.Inner();
在上面的例子中,我 NOT启动外部类,而且在你的情况下是它的抽象,所以那里 毫无疑问它被初始化,但它的内部静态类,也被称为顶级类被初始化。
答案 4 :(得分:-1)
无法实例化抽象类!这是Java规则。