/ / Ще се разшири ли създаде обект от своя супер клас.? - java

Ще се разшири създаване на обект от своята супер класа.? - java

Объркан съм с този прост въпрос. Може ли някой да ми помогне с валиден отговор.

 public class SuperClass{
public SuperClass(){
// may or may not have a constructor for superclass
}
}
public class SubClass extends SuperClass{
// anything here
public static void main(String args[])
{
SubClass sub=new SubClass();
}
}

Сега въпросът ми е дали създавам обект на SubClass прави тя създава обект от SuperClass Ако да защо .. ??

Знам, че повечето хора смятат този въпрос за глупав. Но това са моите въпроси.

Той извиква конструктора на SuperClass, така че как става, ако обект не е създаден.?

Увеличава ли разширенията размера на класа? т.е. SuperClass + SubClass. !!

Отговори:

1 за отговор № 1

Сега въпросът ми е дали създавам обект на подкласа, създава ли той обект на SuperClass Ако да защо .. ??

Не, не е.

Когато го направите

SubClass sub=new SubClass();

само SubClass обект създаден.И само конструктор на супер разговори в клас. И това призоваване към конструктор на супер класа, оковано с вериги, докато стигне до java.lang.Object конструктор.

Странична бележка: Палец на правило (не знайте дали е официално или не, с всеки нов , само един обект създава)

Вие се отнасяте:15.9.4 Оценка по време на изпълнение на изразите за създаване на инстанции от клас

Новият обект съдържа нови екземпляри на всичкиполета, декларирани в посочения тип клас и всички негови суперкласове. Когато всеки нов екземпляр на полето е създаден, той се инициализира до стойността му по подразбиране (§4.12.5).

Така че можете да стигнете до заключение като кога class SubClass extends SuperClass, след това методи, променливи се копират в клас SubClass .

Редактиране:

как може да се извика конструктор, ако обект не е създаден .. ??

Ааа ... твоето съмнение има смисъл за мен.

Но constructor е много специален метод в Java. Можете да декомпилирате файл от клас, можете да видите конструкторите в името на <init>. Не можете да се обадите изрично освен с ключова дума new или super.


1 за отговор № 2

Трудно е да се даде прост отговор да / не, защото това зависи от точните определения на термините, които използвате. Когато кажеш

SubClass sub = new SubClass();

това ще създаде един обект (без да се броят други обекти, създадени от тялото на конструктора или инициализация на полета на членове). Обектът има a клас на изпълнение, което ще бъде SubClass, Ако кажеш sub.getClass() == SubClass.class, това се връща true, Ако кажеш sub.getClass() == SuperClass.class, това се връща false, Така че в този смисъл отговорът е "не", защото класът (време на изпълнение) на обекта е SubClass, не SuperClass.

Новото обаче SubClass обектът също се счита за "инстанция" на SuperClass; ако кажеш sub instanceof SuperClass, този израз е true, Можете също така да използвате sub където и да е SuperClass е необходимо, напр. ако имате променлива SuperClass s можете да зададете s = sub, и ако метод се нуждае от SuperClass параметър, можете да преминете sub към него. В OOP, наследяване (extends в Java) означава an е връзка и в този смисъл a SubClass е SuperClass, и следователно sub също е SuperClass, Но имайте предвид, че нейният клас на изпълнение никога промени.

SuperClass s = sub;
boolean b1 = (s.getClass() == SuperClass.class);  // false
boolean b2 = (s.getClass() == SubClass.class);    // true

Разбира се, за да отговорите на точния въпрос „създава ли обект на SuperClass“, отговорът може да бъде „да“, ако конструкторът изглежда като

public SubClass () {
this.myParent = new SuperClass();
}

Сега конструкторът създава обект на SubClass и отделен обект на SuperClass, Но аз съм сигурен, че това не е това, което сте имали предвид. :)

РЕДАКТИРАНЕ: За да адресирате въпросите, които сте добавили по-късно:

Той извиква конструктора на SuperClass, така че как става, ако обект не е създаден.?

Най- SubClass обектът съдържа полетата член, декларирани за SuperClass, плюс полетата член, декларирани за SubClass, (Плюс полетата за членове, декларирани за Object и всеки друг суперклас между тях.) Но това все още е само един обект, съдържащ всички тези полета SubClass конструктор извиква a SuperClass конструктор, който (вероятно) инициализира полетата, декларирани за SuperClass; тогава SubClass конструктор може да инициализира полетата, декларирани за SubClass.

Увеличава ли разширенията размера на класа? т.е. SuperClass + SubClass. !!

Ако нови полета за членове са декларирани в SubClass, тогава да, a SubClass вероятно използва повече памет, тъй като има всички полета, декларирани в SuperClass плюс всички полета, декларирани в SubClass.


0 за отговор № 3

Въпросът ви е малко объркващ. - Не създавате обект SuperClass, защото единственият създаден обект е обект SubClass. - В друга перспектива, да, вие създавате обект SuperClass, защото SubClass обектът е SuperClass обект. С други думи, "SuperClass obj = нов подклас ();" е напълно валиден - Извиква се конструкторът на SuperClass


0 за отговор № 4

Не, не създава обект на Superclass. Въпреки че наследява от свръхкласа, той изпълнява своите конструкторски и инициализационни блокове (ако има такива), а също така получава своето състояние и поведение.