Означает ли вызов конструктора создание объекта?
когда мы создаем объект подкласса, который расширяет абстрактный класс, конструктор абстрактного класса также запускается . Но мы знаем, что не можем создавать объекты абстрактного класса. Следовательно, означает ли это, что даже если конструктор завершает работу без каких-либо исключений, нет никакой гарантии, будет ли создан объект?
8 ответов
следовательно, это означает, что даже если конструктор завершает работу без каких-либо исключений, нет никакой гарантии того, является ли объект создан?
проще говоря, a constructor
не создает объект. Это просто инициализирует the государство объекта. Это new
оператор, который создает объект. Теперь давайте разберемся в этом немного подробнее.
при создании объекта с помощью оператора это:
new MyClass();
объект сначала создается new
оператора. Непосредственно перед тем, как ссылка на вновь созданный объект возвращается в результате, указанный конструктор обрабатывается для инициализации нового объекта.
Теперь рассмотрим случай Abstract class
и Б SubClass
, когда вы делаете так:
AbstractClass obj = new ConcreteClass();
new
оператор создает объект ConcreteClass
, и вызывает его конструктор для инициализации состояния созданного объект. В этом процессе конструктор абстрактного класса также вызывается из ConcreteClass
конструктор, чтобы инициализировать состояние объекта в абстрактном классе.
Итак, в основном объект AbstractClass
не создается. Просто его конструктор вызывается для инициализации состояния объекта.
Уроки:
объект создается
new
оператор, а не вызов сам конструктор. Итак, объект -уже создан перед любым конструктором вызывается.конструктор используется только для инициализации состояния созданного объекта. Он не создает сам объект.
состояние объекта также может содержаться в абстрактном супер классе.
- Итак, цель вызова
Abstract class
конструктор, предназначен только для полной инициализации объекта, и ни один объект не создается в процессе.
посмотреть:
но мы знаем, что мы не можем создавать объекты абстрактного класса
правильно, но JVM может.
это значит, что даже если конструктор завершает работу без каких-либо исключений , нет никакой гарантии, будет ли созданный объект ?
объект определенно создан внутренне.
означает ли вызов конструктора создание объекта?
не всегда. вы можете вызвать конструктор с помощью super()
и this()
но он не будет создавать экземпляр объекта. (но просто вызовет конструктор)
class AClass
{
AClass()
{
this(1); // will invoke constructor, but no object instatiated.
}
AClass(int a)
{
}
public static void main(String[] args)
{
AClass obj = new AClass(); // one object instantiated.
}
}
исключая любые исключения, конструктор абстрактного класса запускается только из конструктора подкласса (как первый оператор). Поэтому вы можете быть уверены, что каждый раз, когда конструктор запущен, он находится в процессе создания объекта.
тем не менее, вы можете вызвать более одного конструктора в процессе создания одного объекта, например Subclass()
вызов Subclass(String)
которых звонки AbstractClass
через super()
вызова, и так далее.
Subclass == BaseClass + Extras you add in sub class
таким образом, когда вы создаете подкласс, вызывая его конструктор, также есть вызов конструктора базового класса, чтобы убедиться, что все атрибуты (базового класса) также правильно инициализированы.
вы можете вызвать конструктор абстрактного класса только как часть конструктора конкретного подкласса. Это нормально, так как абстрактный класс расширяется в конкретный класс и объект этого конкретного класса это создается.
при вызове конструктора с помощью new
новый объект создается.
Теперь, как вы, вероятно, уже знаете, каждый конструктор любого подкласса, неявно или явно, прямо или косвенно, вызывает конструктор из родительского класса (который, в свою очередь, вызывает один из своя родительский класс, вплоть до объекта). Это называется цепочкой конструкторов.
вышеизложенное, однако, не означает, что создается несколько объектов. Объект был создан на new
вызов и все конструкторы, работающие над этим объектом, уже передали выделенную область. Поэтому цепочка конструкторов не создает новые объекты. Один звонок в new
вернет вам один объект.
вот как работает поток при вызове конструктора вашего подкласса:
- конструктор абстрактного класса запускает -- > объект наполовину инициализирован здесь.
- конструктор подкласса завершает выполнение -- > объект полностью инициализирован и, следовательно, полностью создан здесь.
Я полностью не согласен с тем, что объект для абстрактного класса не может быть создан, и только jvm может сделать это в случае наследования даже программист может сделать это t раз, когда или где он/она намеревается сделать это, используя концепцию анонимного класса: Посмотрите на этот код и попробуйте его самостоятельно
abstract class Amit{
void hai()
{System.out.print("Just Wanna say Hai");}
abstract void hello();
}
class Main{
stic public void main(String[]amit)
{
Amit aa=new Amit(){
void hello(){Sstem.out.print("I actually dont say hello to everyone");
}};
aa.hello(); }}