繁体   English   中英

抽象类中的静态类

[英]Static Class in Abstract Class

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 ,而是对该抽象类中存在的内部类做new的操作。 在这种情况下,抽象类充当命名空间。

您不能实例化一个抽象类。 您的示例“有效”是因为您并未真正实例化抽象类。

MyClass myClass = new SampleClass();

SampleClass是MyClass类的子级和实现,因此它不是抽象的。 因此,这条线只是应该工作。 尝试将new SampleClass()替换为new MyClass() ,您将收到编译器错误。

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

在这种情况下与:

StaticClass staticClass = new StaticClass();

只是在抽象类内部声明的内部类的实例。 由于此内部类不是抽象的,因此可以实例化。

您不能为抽象类创建实例(除非您使用反射)。 因此,如果您执行new MyClass() ,则仅是编译时错误。 否则,它可以正常工作,例如您的示例。

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

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

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

尝试这个...

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

2.因此,访问内部类(静态或非静态)需要外部类。

例如:

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

在上面的示例中,我不是在初始化外部类,而是在您的情况下,它不是抽象的,因此没有问题被初始化 ,但它的内部静态类(也称为顶级类)已被初始化。

无法实例化抽象类! 这就是Java规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM