Внутренние статические классы в Java

1
public interface Bsuper {

    abstract class A {
        abstract void test1();

        void test2() {
            System.out.print("test2 ");
        }
    }
}

// second file
public class Bsub extends Bsuper.A {

    void test1() {
        System.out.print("test1 ");
    }
}

// third file
public class Bsubmain {

    public static void main(String args[]) {
        Bsub sub1 = new Bsub();
        Bsuper.A obj = new Bsub();
        sub1.test1();
        sub1.test2();
        obj.test1();
        obj.test2();
    }
}

Он выводит результат как ожидаемый test1 test2 test1 test2, но мой вопрос находится в классе Bsuper, класс A является статичным, мы все это знаем, и теперь, когда ключевое слово abstract становится абстрактным, но как можно иметь как абстрактные, так и статические применяется к классу в то же самое время. Я класс А действительно статичный также или есть какие-либо другие объяснения для него. Пожалуйста, ответьте!

Теги:

2 ответа

1
Лучший ответ

Помните, что static inner класс использует другую концепцию статического.

В этом случае это означает, что внутренний класс не имеет доступа к переменным экземпляра внешнего класса.

public class Test {
    long n = 0;

    static class A {
        // Not allowed.
        long x = n;
    }

    class B {
        // Allowed.
        long x = n;
    }

}

Сделать их abstract ничего не меняет.

    abstract static class C {
        // Not allowed.
        long x = n;
    }

    abstract class D {
        // Allowed.
        long x = n;
    }
3

как можно одновременно применять как абстрактный, так и статический класс.

Совершенно верно иметь static abstract класс. Это отличается от static abstract метода, который не имеет смысла, поскольку вы не можете переопределить такие методы, и вы также делаете его abstract. Но со static классом вы можете, конечно, extend его, никаких проблем. Создание abstract просто ограничивает вас созданием его экземпляра.

Таким образом, даже это справедливо:

class Main {
    static abstract class Demo { }
    class ConcreteDemo extends Demo { }
}

В этом случае вы не можете создать экземпляр Demo, и вы можете создать экземпляр ConcreteDemo.

  • 0
    Спасибо за объяснение!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню