2009-05-08 4 views
3

Класс может быть «подклассом» самого себя, если его внутренний класс расширяет внешний класс , поэтому класс как-то расширяется, не бросая никакого Исключения. Итак, действительно ли это означает, что класс также является подклассом самого себя?Java: Является ли класс подклассом самого себя?

Спасибо.

ответ

6

Класс не является подклассом самого себя. Внутренний класс может быть подклассом другого класса, но это отдельный класс. Вы можете проверить это, сравнив экземпляры класса, которые вы получаете, когда вызываете getClass().

1

№. Внутренний класс - это нечто совершенно отличное от его внешнего класса. Если я не понимаю ваш вопрос ...

3

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

+0

необязательно, он может просто изменить поведение на – Peter

0

Если определить сам класс подклассов, как это:

public class Test { 

    public static void main(String[] args) { 
     // whatever... 
    } 

    class TestChild extends Test { 
     // whatever... 
    } 
} 

Тогда да, это возможно. Но обратите внимание, что это два совершенно отдельных класса, за исключением того, что один является внутренним для другого.

+0

В вашем примере нет класса «внутренний» для любого другого класса. – Bombe

+0

Это отдельные классы. Попробуйте использовать внутренние классы. – Joset

+0

упс, скобки перепутались –

2

На самом деле JVM сейчас ничего не знает о внутренних классах.

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

В теории ООП класс не может быть его подклассом или суперклассом.

+0

Замечание полностью верно. Он помечен в формате байт-кода. В качестве примера: http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getEnclosingClass() –

+0

Правда, есть метаданные, добавленные так, что их можно ожидать в библиотеке отражения , Однако сам формат класса не имеет специальной обработки внутренних классов. Это обычные классы, которые имеют забавные имена и некоторые дополнительные метаданные. – Antimony

3
public class ParentClass { 

    int intField = 10; 

    class InnerClass extends ParentClass { 

    } 

    public static void main(String... args) { 
     ParentClass parentClass = new ParentClass(); 
     InnerClass innerClass = parentClass.new InnerClass(); 

     System.out.println(innerClass.intField); 

     InnerClass innerClass2 = innerClass.new InnerClass(); 
    } 
} 
+0

+1 для примера .. – DragonBorn

Смежные вопросы