Home > Back-end >  Why can sibling classes be referred to with dots from each other?
Why can sibling classes be referred to with dots from each other?

Time:10-22

I just found a curious case.

class SomeClass {

    abstract static class AbstractNested
            extends SomeClass {

    }

    static class Sibling1
            extends AbstractNested {

    }

    static class Sibling2
            extends AbstractNested {

    }

    void a() {
        new Sibling1.Sibling2(); // @@?
    }
}

Why on earth does new Sibling1.Sibling2(); work? How can I make it doesn't?

CodePudding user response:

Sibling1 and Sibling2 aren't just siblings; they both extend the outer class (indirectly, via AbstractNested), and so they inherit the nested class members.

CodePudding user response:

As Boann's answer,the reason is that both Sibling1 and Sibling2 are extends from AbstractNested,and AbstractNested are extends from SomeClass, so they are all subclass of SomeClass

If you remove extends from Someclass or Sibling1 it will not compile

Case 1:

class SomeClass {

    abstract static class AbstractNested
            extends SomeClass {

    }

    static class Sibling1 {

    }

    static class Sibling2
            extends AbstractNested {

    }

    void a() {
        new Sibling1.Sibling2(); // will not compile
    }
}

Case 2:

class SomeClass {

    abstract static class AbstractNested {

    }

    static class Sibling1
            extends AbstractNested {

    }

    static class Sibling2
            extends AbstractNested {

    }

    void a() {
        new Sibling1.Sibling2(); // will not compile
    }
}
  • Related