Как я новичок в java, я хотел бы знать, 1. Сколько конструкторов по умолчанию определено, когда я делаю пустой класс? 2. Нужно ли мне определять конструктор копирования, или он определяется автоматически, как в C++?По умолчанию java Constructor
ответ
Существует только один конструктор по умолчанию, который определяется только при объявлении конструкторов для класса. В противном случае объявленные конструкторы будут единственными конструкторами. Если вы не включаете в себя конструктор, компилятор вставляет код, эквивалентный
public ClassName() {
super();
}
Кроме того, если вы объявить конструктор для класса, и вы явно не определить конструктор вызова суперкласса, компилятора будет вставлять вызов соответствия параметров суперклассу.
public ClassName extends SuperClassName {
public ClassName(String item, List stuff) {
// no explicit super class constructor called
...
}
}
трансформируется в компилятор что-то вроде
public ClassName extends SuperClassName {
public ClassName(String item, List stuff) {
// explicit super class constructor call to SuperClassName(item, stuff);
super(item, stuff);
...
}
}
Чтобы определить конструктор копирования, нет специального синтаксиса, вы в основном определить конструктор, который принимает другой экземпляр вашего класса в качестве аргумента.
public ClassName(ClassName other) {
field = other.field;
field2 = other.field2;
field3 = new ArrayList(other.field3);
...
}
Там нет такого понятия, как конструктор копирования по умолчанию, на самом деле не существует такого понятия, как конструктор копирования, Есть только конструкторы. Если вы решили создать один или несколько экземпляров, которые, похоже, копируют объект, пусть будет так.
Причина, по которой Java нуждается в меньшем количестве элементов, несколько связана не с перегрузкой основных операторов. Если вы не ставите больше значений на =
, вам не нужно столько типов конструкторов, чтобы поддерживать разные методы распределения объектов.
Одна из причин, по которой =
может использоваться так просто из-за того, что Java передает только ссылки, которые являются своего рода указателями; но они строго типизированы, вы не можете делать какую-либо математику указателя или смещения доступа. Таким образом, они подходят только для назначения и передачи по ссылке, что предотвращает большинство проблем с указателями.
Если вы не создаете конструктор, есть только один конструктор по умолчанию, который компилятор неявно добавляет. Это непараметрированный конструктор.
class SomeClass{
public SomeClass() // all this is implicitly added if you don't specify anything.
{
super();
}
}
documentation Из:
Компилятор автоматически обеспечивает без аргументов, конструктор по умолчанию для любого класса без конструкторов. Этот конструктор по умолчанию вызовет конструктор без аргументов суперкласс. В этой ситуации компилятор будет жаловаться, если у суперкласса нет конструктора без аргументов, поэтому вы должны убедиться, что он это делает. Если ваш класс не имеет явного суперкласса , то он имеет неявный суперкласс Object, у которого есть конструктор no-argument .
И на Java нет такой вещи, как copy-constructor. Если вы определяете одно явно, то это другая проблема, но компилятор никогда не будет автоматически определять такую вещь на Java.
1. Сколько конструкторов по умолчанию определено, когда я делаю пустой класс?
Класс таких как
class MyClass {
}
имеет один (пустой) конструктор по умолчанию, который ведет себя как
...
public MyClass() {
}
...
2. Значит ли мне нужно определить копию конструктор или он определяется автоматически, как в C++?
Там не существует понятия встроенной копии конструкторы в Java, и есть основная причина для этого:
В Java переменные не может содержать объект (он может только содержат ссылка на объект). Поэтому, когда вы делаете foo(obj)
, тогда объект, который obj
ссылается на него, не нужно копировать.
Чтобы сделать копию объекта, который Вы обычно создать конструктор, такие как
...
public MyClass(MyClass objToCopy) {
this.field1 = objToCopy.field1;
...
this.fieldN = objToCopy.fieldN;
}
...
или полагаться на механизм clone()
.
Похожие вопросы:
+1 для лучшего объяснения – 11684
Конструктор по умолчанию фактически содержит 'super();', не так ли? – brimborium
Я бы назвал вторую часть «Если вам нужен конструктор копирования, вам придется написать его самостоятельно». – user949300
Выше все ответы прекрасно .. Просто добавить еще одну вещь для более четко .. Конструктор по умолчанию является один, который компилятор добавляет себя, когда вы не определяете какой-либо конструктор ... , как указано выше:
public ClassName() { super(); }
Но если вы пишете конструктор себя в классе ... как если вы пишете такой же конструктор вашей собственной личности в классе .. чем технически этот конструктор не будет вызван конструктор по умолчанию ...
Надеюсь, у вас есть смысл.
Если конструктор не указан, пустой конструктор автоматически определяет. Как только вы укажете один или несколько конструкторов, будут определены только эти конструкторы.
Нет конструктора копирования, но каждый класс в Java продолжается от объекта Object, который как метод clone().
- 1. По умолчанию Constructor Calls
- 2. По умолчанию Constructor Visbility в Java
- 3. По умолчанию Constructor, Java vs C++
- 4. По умолчанию Constructor Recursion Crash
- 5. Constructor, которые принимают параметры по умолчанию
- 6. По умолчанию Constructor - отсрочка инициализации переменных-членов
- 7. По умолчанию Constructor никогда не назывался
- 8. Generics Default Constructor Java
- 9. Java Constructor не определен
- 10. Переменная окружения Java по умолчанию по умолчанию
- 11. Значения по умолчанию Java по умолчанию
- 12. Java Constructor undefined?
- 13. Синтаксис Java Constructor Issue
- 14. Java gui and constructor
- 15. По умолчанию Constructor C++ с заголовком и cpp
- 16. По умолчанию Move Constructor в Visual Studio 2013 (обновление 3)
- 17. Почему коэффициент заполнения по умолчанию для HashSet Constructor 0.75?
- 18. Почему нет назначения-назначения/move-constructor по умолчанию?
- 19. C++ Beginner: вызов по умолчанию vs custom constructor
- 20. Undefined Constructor, но у меня есть Контрактор по умолчанию?
- 21. Создает ли C++ по умолчанию «Constructor/Destructor/Copy Constructor/Copy assign operator» для чистого виртуального класса?
- 22. Инициализация инициатора Java Constructor
- 23. Параметры Java Constructor Super
- 24. java xml literal constructor
- 25. Java Constructor не работает
- 26. Java, enum with constructor
- 27. java constructor: this (.)
- 28. Переменные Java Constructor игнорируются
- 29. Java Constructor & Arrays
- 30. Встраивание Java Constructor
Один вопрос на вопрос пожалуйста. –