- Методы против конструкторов в Java
- 10 ответов
- Как конструкторы отличаются от методов? Позвольте мне посчитать пути.
- Итак, что похоже на методы и конструкторы?
- Что касается конструкторов и методов, имеющих одинаковые модификаторы видимости. поля и методы имеют более общие модификаторы видимости.
- В заключении
- Отличия конструкторов от обычных методов.
Методы против конструкторов в Java
Я только что начал программировать на Java. Текст, который мы используем, отсутствует при обсуждении методов и конструкторов. Я не уверен, что метод или конструктор точно и что делает каждый уникальный. Может кто-то, пожалуйста, помогите мне определить их и провести различие между ними?
10 ответов
Важное различие между конструкторами и методами заключается в том, что конструкторы инициализируют объекты, которые создаются с помощью оператора new , тогда как методы выполняют операции над уже существующими объектами.
Конструкторы не могут быть вызваны напрямую; они называются неявно, когда ключевое слово new создает объект. Методы могут быть вызваны непосредственно на объект, который уже был создан с помощью new .
Определения конструкторов и методов выглядят одинаково в коде. Они могут принимать параметры, они могут иметь модификаторы (например, public ), и у них есть тела методов в фигурных скобках.
Конструкторы должны иметь имя с тем же именем, что и имя класса. Они ничего не могут вернуть, даже void (сам объект является неявным возвратом).
Должны быть объявлены методы, чтобы вернуть что-то, хотя это может быть void .
«Вызов конструктора» обычно относится к использованию new ключевого слова для вызова конструктора и создания объекта. Внутри конструктора он может ссылаться на вызов другого конструктора или конструктора суперкласса через синтаксис this() или super() , иногда с аргументами.
Я не знаю, что такое «super ()», однако я использовал «this ()» при создании «мутатора», который, как я теперь понимаю, является методом, похожим на «метод доступа».
LOL, возвращение к старым вопросам заставляет меня смеяться . Спасибо, этот ответ, это был последний раз, когда я должен был задать этот вопрос .
@rgettman Конструкторы не могут ничего вернуть, даже тогда у конструкторов может быть оператор return. «вернуть;» допустимо в конструкторе, но «return 0;» это ошибка времени компиляции Так можем ли мы сказать, что void имеет тип возвращаемого значения неявно? Если он имеет тип возвращаемого значения по умолчанию, то можем ли мы сказать, что конструктор — это специальный метод?
1. Конструктор используются для инициализации состояния объекта, где метод раскрывает поведение объекта.
2. Конструктор не должен иметь тип возвращаемого значения, где метод должен иметь тип возврата.
3. Конструктор имя совпадает с именем класса, где метод может или не может совпадать с тем же именем класса.
4. Конструктор вызывает неявно, когда метод вызывает явно.
5. Конструктор компилятор предоставляет конструктор по умолчанию, где компилятор метод не предоставляет.
Другие преподаватели и преподаватели иногда говорят мне, что конструкторы — это специализированные методы. Я всегда утверждаю, что в конструкторах Java НЕ являются специализированными методами.
Если бы конструкторы были методами вообще, я бы ожидал, что они будут иметь те же способности, что и методы. То, что они, по крайней мере, были бы похожими по-разному, чем они отличаются.
Как конструкторы отличаются от методов? Позвольте мне посчитать пути.
- Конструкторы должны быть вызваны с помощью оператора new , в то время как методы не могут быть вызваны с помощью оператора new . Связано: конструкторы могут не вызываться по имени, а методы должны вызываться по имени.
- Конструкторы могут не иметь тип возвращаемого значения, тогда как методы должны иметь тип возврата.
- Если метод имеет то же имя, что и класс, он должен иметь тип возврата. В противном случае это конструктор. Тот факт, что вы можете иметь две подписи MyClass() в том же определении класса, которые обрабатываются по-разному, должны убедить всех, что конструкторы и методы являются разными объектами:
public class MyClass < public MyClass() < >// constructor public String MyClass() < return "MyClass() method"; >// method >
Итак, что похоже на методы и конструкторы?
- У них обоих есть списки параметров.
- У них есть блоки кода, которые будут выполняться, когда этот блок либо вызван напрямую (методы), либо вызван через new (конструкторы).
Что касается конструкторов и методов, имеющих одинаковые модификаторы видимости. поля и методы имеют более общие модификаторы видимости.
- Конструкторы могут быть: private, protected, public.
- Методы могут быть: private, protected, public, abstract, static, final, synchronized, native, strictfp.
- Поля данных могут быть: конфиденциальными, защищенными, общедоступными, статическими, конечными, переходными, неустойчивыми.
В заключении
В Java форма и функция конструкторов существенно отличаются от форм. Таким образом, называть их специализированными методами на самом деле усложняет для новых программистов изучение различий. Они гораздо более похожи, чем аналогичные, и изучают их, поскольку разные сущности являются критическими в Java.
Я действительно признаю, что Java отличается от других языков в этом отношении, а именно С++, где возникает понятие специализированных методов и поддерживается языковыми правилами. Но в Java конструкторы не являются методами вообще, а тем более специализированными методами.
Даже javadoc распознает различия между конструкторами и методами, перевешивает сходства; и предоставляет отдельный раздел для конструкторов.
Отличия конструкторов от обычных методов.
Конструктор — это специальный метод, который предназначается для первичной установки значений полей объекта. На первый взгляд конструкторы объектов не сильно отличаются от обычных методов объекта. И действительно внутри конструктора мы можем делать всё то же, что и в обычных методах объекта: выводить текст в консоль, обращаться ко всем полям и методам нового объекта, выбрасывать исключения и так далее. Так же как и обычные методы, конструкторы могут иметь аргументы. Так же как и перегруженных методов, конструкторов может быть несколько с различными сигнатурами. Так же как и дженерик-методы конструкторы могут быть параметризованы переменными типов. Даже если мы заглянем в байт-код генерируемый компилятором, в месте где должен быть вызов конструктора, мы обнаружим обращение к некоторому методу с именем вызов которого не отличается от вызова других методов объекта. А найдя байт-код этого метода мы обнаружим, что он и содержит результат компиляции нашего конструктора. Кажется что отличий от обычных методов не много, но они есть, и довольно существенные. Для начала давайте разберёмся, а для чего нам собственно нужны конструкторы? Для хранения и обработки каких либо данных, будь то примитивные типы, массивы, или объекты нам необходим некоторый объём памяти. Это могут быть регистры процессора, место на стеке, либо кусочек пространства, выделенный в секции данных процесса, либо в динамически размещаемой части памяти (куче). Во многих языках программирования, в целях ускорения, при запросе программой нового кусочка памяти, память отдавалась программе не отчищенной, и могла содержать произвольные данные, которые были сохранены в этой ячейки памяти ранее. Подготовка и запись в такой кусок памяти необходимых значений, чтобы в итоге там оказался какая-либо осмысленная структура данных, ложилась целиком на плечи программиста. Вполне естественно программисты хотели облегчить себе жизнь и писали подпрограммы для инициализации (то есть установки начальных значений) для часто используемых структур данных. Такие подпрограммы применялись практически постоянно, так что создатели языка Java, решили сделать подобные подпрограммы инициализации обязательными для вызова при создании объектов, и назвали их конструкторами. Когда в Java создаётся новый объект происходит следующее: Сначала менеджер памяти Java выделяет объём памяти необходимый для размещения объекта. При этом учитываются не только поля объявленные непосредственно в классе создаваемого объекта, но так же поля объявленные во всех предках этого класса. Дополнительно в этот объем включается пространство для размещения структур которые используются Java-машиной для внутренних нужд. Все поля такой «заготовки» автоматически устанавливаются в дефолтные значения — null для ссылочных типов, 0 для чисел и false для boolean . После этого, автоматически вызывается конструктор класса, задача которого установить начальные значения полей объекта. Если в обычном методе первый оператор может быть любым, то у конструктора гораздо меньше свободы. Первым оператором конструктора должен быть либо явный вызов другого конструктора того же класса, либо явный или неявный вызов конструктора родительского класса. Явный вызов конструкторов того же класса осуществляется с помощью ключевого слова this за которым следует набор аргументов заключённый в скобки. Явный вызов конструктора родительского класса производится точно так же, но при этом используется ключевое слово super . В аргументах явного вызова конструктора того же, либо родительского класса нельзя обращаться к полям и методам объекта, равно как и использовать ключевые слова this и super , так как явный вызов конструктора вводит статический контекст. Для неявного вызова конструктора родительского класса писать ничего не надо, но при этом неявно вызывается конструктор по-умолчанию, который должен существовать и быть видимым для текущего класса. При этом, следует иметь ввиду, что если цепочка вызова родительских конструкторов прервётся до того как конструктор класса Object , находящийся на вершине цепочки, успешно завершит свою работу, то объект не будет финализируемым, то есть метод finalize() такого объекта никогда вызван не будет. После завершения работы конструктора родительского класса, управление неявно передаётся на блоки инициализаторов экземпляра и инициализаторы полей экземпляра текущего класса. Инициализаторы исполняются в том порядке, в каком они встречаются в тексте программы. Лишь после завершения работы инициализаторов управление передаётся оставшейся части конструктора. Остальные особенности конструкторов касаются модели памяти Java. Если класс, либо один из его предков, переопределяет метод finalize() , то завершение работы конструктора случится до (happens-before) запуска метода finalize() . Если какой-либо поток увидел ссылку на объект после завершения работы конструктора, то гарантируется что этот поток увидит корректно инициализированные final -поля объекта, инициализация которых произошла до завершения работы конструктора.