2012-06-19 2 views
2

Как я новичок в java, я хотел бы знать, 1. Сколько конструкторов по умолчанию определено, когда я делаю пустой класс? 2. Нужно ли мне определять конструктор копирования, или он определяется автоматически, как в C++?По умолчанию java Constructor

+2

Один вопрос на вопрос пожалуйста. –

ответ

7

Существует только один конструктор по умолчанию, который определяется только при объявлении конструкторов для класса. В противном случае объявленные конструкторы будут единственными конструкторами. Если вы не включаете в себя конструктор, компилятор вставляет код, эквивалентный

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 передает только ссылки, которые являются своего рода указателями; но они строго типизированы, вы не можете делать какую-либо математику указателя или смещения доступа. Таким образом, они подходят только для назначения и передачи по ссылке, что предотвращает большинство проблем с указателями.

1

Если вы не создаете конструктор, есть только один конструктор по умолчанию, который компилятор неявно добавляет. Это непараметрированный конструктор.

class SomeClass{ 

public SomeClass() // all this is implicitly added if you don't specify anything. 
{ 
super(); 
} 

} 

documentation Из:

Компилятор автоматически обеспечивает без аргументов, конструктор по умолчанию для любого класса без конструкторов. Этот конструктор по умолчанию вызовет конструктор без аргументов суперкласс. В этой ситуации компилятор будет жаловаться, если у суперкласса нет конструктора без аргументов, поэтому вы должны убедиться, что он это делает. Если ваш класс не имеет явного суперкласса , то он имеет неявный суперкласс Object, у которого есть конструктор no-argument .

И на Java нет такой вещи, как copy-constructor. Если вы определяете одно явно, то это другая проблема, но компилятор никогда не будет автоматически определять такую ​​вещь на Java.

7

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

+1 для лучшего объяснения – 11684

+1

Конструктор по умолчанию фактически содержит 'super();', не так ли? – brimborium

+1

Я бы назвал вторую часть «Если вам нужен конструктор копирования, вам придется написать его самостоятельно». – user949300

2

Выше все ответы прекрасно .. Просто добавить еще одну вещь для более четко .. Конструктор по умолчанию является один, который компилятор добавляет себя, когда вы не определяете какой-либо конструктор ... , как указано выше:

public ClassName() { super(); }

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

Надеюсь, у вас есть смысл.

1

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

Нет конструктора копирования, но каждый класс в Java продолжается от объекта Object, который как метод clone().

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