Должно быть 2. Функция main
является статической, поэтому ей не нужен объект.
ClassA a
является объектом, а ClassB b
является объектом
РЕДАКТИРОВАТЬ : ClassB не состоит из двух объектов, потому что extends - это отношение is-a
, а не has-a
. (та мик)
EDIT : Существует также объект String[]
, который создается системой времени выполнения, и, возможно, любое количество строковых объектов помещается в этот массив. Я намеренно игнорирую их, но признаю их возможное существование. (та diveshpremdeep и Адам Гуд)
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ : Чтобы определить, сколько объектов создано (программой, а не системой времени выполнения), вы можете использовать программу javap
в командной строке следующим образом (если test.java содержит твой пример)
$ javac test.java
$ javap -c ClassB
выход:
Compiled from "test.java"
class ClassB extends ClassA{
ClassB();
Code:
0: aload_0
1: invokespecial #1; //Method ClassA."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class ClassA
3: dup
4: invokespecial #1; //Method ClassA."<init>":()V
7: astore_1
8: new #3; //class ClassB
11: dup
12: invokespecial #4; //Method "<init>":()V
15: astore_2
16: return
}
Как вы можете видеть, есть только два бита байт-кода, которые new
(что создает объекты, которые я предполагаю). Один для класса ClassA
, а другой для класса ClassB
. Вы можете заметить, что команда invokespecial
вызывается впоследствии для вызова конструктора, а также как вызывается конструктор класса ClassA
из конструктора класса ClassB
, но внутри конструктора не создается новый объект (это пустой конструктор по умолчанию).
вызов javap -c ClassA
показывает столь же скучный конструктор, который вызывает конструктор для Object.
В итоге: байт-код new
создает объекты в куче, а не invokespecial
, который просто заполняет детали памяти, выделенной байт-кодом new
.