Показаны сообщения с ярлыком методы. Показать все сообщения
Показаны сообщения с ярлыком методы. Показать все сообщения

суббота, 10 октября 2020 г.

О методах в Java

 Что такое метод


   Метод (функция) - это набор инструкций (команд), выполняемых программой, которому присвоили имя (имя метода).


    Методы - это функционал класса (то, что объекты этого класса умеют делать).

   Имена методов в Java принято записывать с маленькой буквы.

   Код (тело) метода – это набор выражений (команд) (инструкций). Инструкции для метода должны быть размещены между его фигурными скобками - в "теле метода".

   Аргументы (параметры) метода - все параметры, "принимаемые на входЦ, которые нужно передать методу, указываются внутри пары круглых скобок в виде списка элементов, разделенных символами ";" (точка с запятой). Каждый элемент списка параметров состоит из разделенных пробелом типа и идентификатора.
   Метод может не принимать никаких параметров: если методу для работы не нужны входные параметры, скобки оставляют пустыми, но скобки должны быть в любом случае.

    Важным понятием является сигнатура метода.

   Сигнатура метода определяется именем метода и его аргументами (количеством, типом, порядком следования).

   Если для полей запрещается совпадение имен, то для методов в классе запрещено создание двух методов с одинаковыми сигнатурами.

   Для методов-конструкторов в связи с отсутствием имени (или из-за того, что у всех конструкторов одинаковое имя, совпадающее с именем класса) сигнатура конструктора определяется только набором входных параметров.


    В функцию (метод) можно не только передавать аргументы (параметры), функция еще может возвращать результат(значение) своей работы - это делается с помощью ключевого слова return.
   Оператор return не только возвращает результат работы метода, но и завершает его работу: компилятор Java выдаст ошибку при попытке написать код после return.

   Количество параметров метода можно сделать неопределённым: запись (String...names) переданная в качестве параметра позволяет нам указать, что в метод передается какое-то количество строк, не оговаривая заранее, сколько их должно быть.


    О статических и нестатических методах можно прочитать здесь:

https://javaika.blogspot.com/2019/01/void-static.html



   В Java изначально предопределены (существуют) некоторые специальные методы.

   Например:


   Метод main () играет очень важную роль:
   С этого метода, как правило, начинается выполнение программы: все существующие реализации Java-интерпретаторов, получив команду интерпретировать класс, начинают свою работу с вызова метода main.
   Java-транслятор может оттранслировать класс, в котором нет метода main, а вот Java-интерпретатор запускать классы без метода main не умеет.
   Если не планируется, что программу будут запускать на выполнение, а описанный класс лишь будет использоваться в других программах, то наличие в тексте метода main не обязательно.



    Пример метода main:

   public static void main (String[] args) //Данная строка должна всегда иметь имено эти ключевые слова (см. п.12.1.4 спецификации)
{
Код метода
}
Пример вызова метод:

public class Solution {
   //Далее идет метод main, в котором вызывается на печать результат вычисления в методе inc

   public static void main(String[] args)  {
      System.out.println(inc(5));
   }
   //Далее идёт вызываемый метод inc:
   public static int inc(int a) {
      return a * a;
   }
}


   Для реализации механизма конкатенации (склеивания (объединения) строк) неявно вызывается метод toString(): при сложении строки, числа и объекта число будет преобразовано в строку, и объект будет преобразован в строку.

вторник, 16 июня 2020 г.

Понятие метода - конструктора в JAVA. Ключевое слово this

   Кроме обычных методов классы могут определять специальные методы, называемые конструкторами.
 
   Конструктор в Java - метод класса без типа (не static), который имеет точно такое же имя как имя класса и не возвращает никаких значений, вызываемый при инициализации (создании нового) объекта класса (каждый раз при создании нового объекта вызывается конструктор).
 
   (специальный блок кода, похожий на метод, предназначенный для инициализации объектов при их создании)

   Конструкторы выполняют инициализацию объекта (устанавливают изначальное значение инстанса сразу же при его создании).
   В конструкторе можно задать требования к входящей информации при созданиии объекта его класса.
 
 
   Конструктор (функция-конструктор) - это, по сути, шаблон для объектов класса, который предопределяет наличие и состав обязательных параметров (аргументов) у объекта (класса).

   (Java не позволит создать объект, если указанные для него аргументы отсутствуют).
 

               конструктор "медвежонок" инициализирует объект "медвежонок (побольше)"

   У каждого класса есть конструктор. Конструктор вызывается всегда, когда создаётся новый экземпляр класса.
 
   Если в классе не определено (не прописано) ни одного конструктора, то для этого класса компилятор Java автоматически (по умолчанию) создает конструктор без параметров (аргументов).
 
    Конструктор, созданный по умолчанию, срабатывает каждый раз при создании любого объекта любого класса.
      (Каждый раз, когда создается новый объект, будет вызываться как минимум один конструктор)

   Конструктор можно вызывать из другого конструктора (Java распознает какой конструктор вызывается по введённым для него аргументам).
 
   При создании для класса конструктора, конструктор по умолчанию исчезает из класса.
   При этом его аналог (конструктор без аргументов) для класса с конструктором не по умолчанию может быть создан отдельно, специально. (В этом случае станет возможным создание объектов как с предопределенным составом аргументом, так и без аргументов).


Базовые типы конструкторов в Java:
 
    1) Конструктор по умолчанию (default constructor)
    (невидимый конструктор, автоматически создаваемый компилятором)
 
    Конструктор по умолчанию создает компилятор, если программист не создал свой (Компилятор не сгенерирует конструктор по умолчанию, если программист реализовал свой конструктор).
 
    Поля экземпляра класса при таком конструкторе будут установлены значениями для полей по умолчанию:
    byte     0
    short     0
    int     0
    long     0L
    float     0.0f
    double     0.0d
    char     '\u0000'
    String (or any object)       null
    boolean     false

    2) Конструктор без аргументов (no-args constructor)
 
    Конструктор по умолчанию и Конструктор без аргументов не принимают аргументы.

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

    Хотя у конструктора и не указывается возвращаемый тип, но он все же неявно возвращает тип создаваемого объекта.
    Непосредственно перед тем, как будет возвращен результат в виде ссылки на только что созданный объект, указанный конструктор будет использован для инициализации этого нового объекта.
    Таким образом, вызов Конструктора без аргументов вызывает созданный нами конструктор без аргументов и неявно возвращает результат в виде ссылки на только что созданный объект.

    Объявление переменной для хранения ссылки на создаваемый объект (чтобы можно было к нему обращаться, например, для вызова какого-то метода) выглядит следующим образом:

ТипПеременной имяПеременной = new ИмяКонструктора();

   Объект создаётся при помощи оператора new, который динамически выделяет для него память в куче (heap) и возвращает на него ссылку, которая присваивается переменной.

    Имя класса, идущее после оператора new, указывает на имя его конструктора, который определяет, что происходит при создании объекта (это может быть инициализация полей, вызов других конструкторов и т.д.).


    3) Параметризованный конструктор (parameterized constructor) 

    Параметризированный конструктор принимает аргументы (чтобы иметь возможность передавать нужные начальные значения в объект).

    Если конструкторов у класса несколько, то будет вызываться будет тот конструктор, который указывается при создании объекта набором параметров соответствующим используемому конструктору с таким же самым перечнем праметров.
 
   4) Конструктор копирования (copy constructor)
   Конструктор копирования это специальный конструктор, который принимает в качестве аргумента экземпляр того же класса для создания нового объекта на основе переданного.
   Такие конструкторы применяются тогда, когда необходимо создать копию сложного объекта, но при этом мы не хотим использовать метод clone().
   (Например, если в копии объекта какие-то поля должны отличаться).
 
   Ссылка на имя в конструкторе копирования копируется в значение нового объекта, т. е. значение нового объекта будет ссылаться на один и тот же адрес в памяти, что и оригинальный объект.
   Переменные типа String и класс LocalDateTime являются immutable и никогда не изменятся.
   Чтобы изменить их значения, им нужно будет присвоить другую ссылку. При этом эти поля других объектов будут по прежнему ссылаться на прежнее место в памяти. Заменив ссылку переменной поля порожденного объекта, значение ссылки оригинального объекта остаётся прежним.


    Поверхностное копирование (shallow copy)
    Такой механизм характеризуется копированием ссылок оригинального объекта в создаваемый объект.
    При поверхностном копировании копируются ссылки на значения из оригинального объекта. При этом, если копируемая ссылка принадлежит mutable-объекту (если переменная объекта будет ссылаться на изменяемую (mutable) переменную), то при ее изменении в любом объекте (не важно, в новом или исходном) ее значение изменится во всех других объектах. Т.е. изменения затрагивают все объекты.
 

    Глубокое копирование (deep copy)
    Этот вид копирования позволяет создавать объекты, которые будут содержать точные копии всех полей (в том числе ссылочных) оригинального объекта, но при этом будут абсолютно независимы от оригинального объекта.
    Изменение полей скопированного (склонированного) объекта не отражается на изменении полей оригинального объекта (также и в обратном случае).



    Связанные конструкторы
    Не обязательно передавать в конструктор для инициализации всех полей класса какие-то значения. Часть обязанностей можно возложить на компилятор, который присвоит полям значения по умолчанию (если это не критично). Также, в процессе работы программы, можно использовать сеттеры.



    Объект-значение (Value Objects)
    Один из вариантов использования конструкторов в Java — создание объектов-значений.
    Value Object — это объект, который не меняет своего внутреннего состояния после инициализации (становится immutable). Это значит, что если требуется изменить такой объект, то для этого придется создать его новый экземпляр, вместо того чтобы изменять существующий.



    Если мы используем ключевое слово final при определении членов класса. Это означает, что каждый из них может быть инициализирован только с помощью конструктора. Их нельзя переназначить позже в каком-либо другом методе. Мы можем считать эти значения, но не можем их изменить.
    Если мы создадим несколько конструкторов для класса, то каждый из них должен будет инициализировать каждую финальную переменную. Невыполнение этого приведет к ошибке компиляции. Например, «java: variable amount might not have been initialized».

 


   Основные требования к конструкторам:

    Класс может содержать любое количество конструкторов (NB! у них должны различаться их аргументы иначе выдаст ошибку). При большом количестве конструкторов для упрощения кода можно использовать Шаблоны проектирования из категории Creational Design Patterns. 

   Имя конструктора должно совпадать с именем класса, с учётом регистра.

   Можно считать, что имя конструктора совпадает с именем класса, а можно рассматривать конструктор как безымянный, и имя класса – как тип возвращаемого значения, так как конструктор может породить только объект класса, в котором он объявлен.
 
   Конструктор не может иметь возвращаемый тип (даже void).

   К конструктору можно применять модификаторы доступа для контроля его вызоваю

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

    Конструктор может принимать в качестве аргумента как примитивные типы данных, так и объекты

 
   Для конструктора очень важен порядок следования аргументов.
 

    Значение примитивов (int, float, double и т. д.) копируются как есть
    Ссылки на объекты типа immutable (например String), также копируются как есть. Несмотря на то, что оригинальный и порожденный объекты ссылаются на тот же самый адрес в памяти, immutable-объекты  никогда не будут изменяться
    Ссылки на mutable объекты (например Date, List и т. д.) должны копироваться при помощи глубокого копирования. Иначе оригинальный и порожденный объекты будут ссылаться на один и тот же адрес в памяти и соответственно, любые изменения объекта (оригинального или порожденного) будут отображаться на всех объектах

    Конструктор не может быть объявлен как final, static, synchronized или abstract
    Конструктор может быть перегружен (overload)

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

    Конструкторы могут иметь модификатор доступа private, что не позволит создавать его экземпляры. Например, приватный конструктор может использоваться для контроля над количеством создаваемых экземпляров: всегда можно будет создать только один объект.
        Иногда класс может быть служебным и хранить какие-то статические поля и статические методы. Необходимости в создании экземпляров таких классов нет, поэтому и в конструкторе нет смысла, но как мы уже знаем, компилятор создаст конструктор по умолчанию. Чтобы этого не произошло, мы можем сами создать пустой конструктор и сделать его закрытым, используя модификатор доступа private. Такой конструктор называется закрытый.

    Метод namesConcatinate объединяет имя и фамилию в одну строковую переменную. Закрытый конструктор BankAcoountUtils() делает невозможным создание экземпляра класса BankAccountUtils. Следующий код выведет объединенную строковую переменную без создания объекта:

Конструктор по умолчанию имеет тот же самый модификатор доступа, что и класс


    Конструктор класса вызывает конструктор по умолчанию его суперкласса (по цепочке вплоть до Object)
    Компилятор Java автоматически вставляет неявно вызов super () в первую строку любого конструктора. Поэтому, обращайте внимание на это правило при наследовании родительского класса.
    Первым выражением в конструкторе должен быть вызов метода this () или super()

    Конструктор и сеттеры можно (нужно) использовать совместно:

    Если используется конструктор по умолчанию, то далее предполагается, что при помощи сеттеров (setter) полям объекта присваиваются нужные нам значения, которые на момент его создания были неизвестны.
    В случае же с параметризованным конструктором, значения полей сразу инициализируются подходящими нам значениями. Один вызов такого конструктора заменяет собой вызов нескольких сеттеров. При этом создается объект с корректными значениями полей. Кроме того, параметризованный конструктор позволяет создать неизменяемый объект (immutable — это объект, состояние которого не может быть изменено после создания), что невозможно при использовании сеттеров.
    Также, возможны комбинации, когда объект создается с несколькими обязательными полями, и с полями, инициализированными значениями по умолчанию, которые в дальнейшем могут неоднократно изменяться сеттерами. 
 

 
 
О конструкторах можно посмотреть по ссылке: https://www.youtube.com/watch?v=f88zS-etDWs
 
 
 
   При инициализации аргументов используется this:

   (вообще this, как правило, применяется в следующих случаях:
      - когда у переменной экземпляра класса и переменной метода/конструктора одинаковые имена
      - для явного вызова конструктора (когда нужно вызвать конструктор одного типа (к примеру, конструктор по умолчанию или параметризированный) из другого) 
   (ключевое слово this это указатель на текущий объект класса)


   Пример применения метода-конструктора:


public class Tea {

    String name;

     int age;

 //конструктор для класса Tea

     public void setTea(String name, String sort) {

    this.name = name;

    this.sort = sort;

 }

    public static void main(String[] args) {

        Tea cup = new Tea("Green", '"Japanese");

    }

 }

 

   Также завершает заголовок конструктора throws-выражение, поскольку создать ошибку – это единственный способ для конструктора не создавать объект: если конструктор выполнился без ошибок, то объект гарантированно создается.
 
 
   Тело конструктора пустым быть не может и поэтому всегда описывается в фигурных скобках (скобки при необходимости могут быть пустыми).

   Также тело конструктора может содержать любое количество return-выражений без аргументов.
   Если процесс исполнения дойдет до такого выражения, то на этом месте выполнение конструктора будет завершено.
 
    Так как при вызове конструктора осуществляется создание и инициализация объекта, такой процесс не может происходить без обращения к конструкторам всех родительских классов.
   Поэтому вводится обязательное правило - первой строкой в конструкторе должно быть обращение к родительскому классу, которое записывается с помощью ключевого слова super, за которым идет перечисление аргументов.
 
   В теле конструктора используется ключевое слово this с круглыми скобками, которое позволяет вызывать другой конструктор, передавая в него аргументы (не любой, а только тот, который подходит по количеству и типам передаваемых аргументов). Это нормальная практика вызывать конструкторы по цепочке (в рамках текущего класса), когда часть значений используется по умолчанию, а какие-то являются новыми.
   Но бывает и другая ситуация, когда мы хотим перед отработкой конструктора потомка вызвать конструктор суперкласса. В таком случае нужно использовать ключевое слово super().
 
 
   Создание объекта

   Создание объекта начинается при исполнении выражения с ключевым словом new, за которым следует имя класса, от которого будет порождаться объект, и набор аргументов для его конструктора.
   По этому набору определяется, какой именно конструктор будет использован, и происходит его вызов.
   Первая строка его тела содержит вызов родительского конструктора. В свою очередь, первая строка тела конструктора родителя будет содержать вызов далее к его родителю, и так далее. Восхождение по дереву наследования заканчивается, очевидно, на классе Object, у которого есть единственный конструктор без параметров.
   Именно в этот момент JVM порождает объект, и далее начинается процесс его инициализации.
   Выполнение начинает обратный путь вниз по дереву наследования.
 
   У самого верхнего родителя, прямого наследника от Object, происходит продолжение исполнения конструктора со второй строки. Когда он будет полностью выполнен, необходимо перейти к следующему родителю на один уровень наследования вниз и завершить выполнение его конструктора, и так далее.
   Наконец, можно будет вернуться к конструктору исходного класса, который был вызван с помощью new, и также продолжить его выполнение со второй строки.

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

суббота, 1 декабря 2018 г.

3 Из чего состоит JAVA программа. Классы, объекты, методы, пакеты, интерфейсы

   Исходный код программы Java состоит из классов, классы содержат в себе методы (функции), а методы содержат в себе команды. Классы и интерфейсы группируют в пакеты.
 
  •    В исходном виде программа на языке Java это набор файлов с расширением java, содержащих исходный код на языке Java
  
  •    В скомпилированном виде программа на языке Java это набор объектов - скомпилированных классов и интерфейсов, содержащихся в двоичных файлах с расширением class, которые предназначены для выполнения виртуальной машиной Java

   Весь исполняемый код, написанный на языке Java, хранится внутри классов или интерфейсов. Вне классов и интерфейсов могут располагаться лишь инструкции import и package, а также комментарии.
   Скомпилированные файлы должны быть размещены в каталогах с иерархической структурой, повторяющей структуру пакетов, в которые вложены данные классы и интерфейсы. 

   В простейшем случае программа состоит из файла, в котором содержится исходный код единственного класса и один метод main.
   (Минимальная программа состоит из одного класса)

   (Если планируется, что программу не будут запускать на выполнение, а описанный класс будет лишь использоваться в других программах, то наличие в тексте метода main не обязательно)
   Обязательным условием корректности такой программы является совпадение имени файла (без расширения) с именем единственного класса размещённого в этом файле.
   Например, класс Tea должен храниться в файле с именем Tea.java.

   В одном файле может содержаться несколько классов.    В этом случае имя файла (без расширения) должно совпадать с именем любого из этих классов.

   Программа может состоять из нескольких файлов, в каждом из которых содержатся один или более классов.
   В этом случае имя каждого класса (без расширения) должно совпадать с именем одного из классов, в нём содержащихся.

   Пример простейшей программы:

   public class Tea
{
   public static void main (String[] args)
   {
   Код метода
   }
}


Что такое пакеты
 
   Когда файлов с классами много, то их, как правило, группируют (помещают) в специальные контейнеры - пакеты, создавая тем самым иерархическую систему  (как аналог папок (директорий) в файловой системе (на компьютере)).
 
   На диске пакет является каталогом (папкой) и все исходные файлы и файлы классов, принадлежащих одному и тому же пакету, находятся в одном каталоге.
   Java пакеты могут содержаться в сжатом виде в JAR файлах.
 
   Имена пакетов и подпакетов нужно указывать в коде класса, и они должны совпадать с именами папок и подпапок на диске. Т.е. имя класса обязано совпадать с именем файла, в котором этот класс описан, а имя пакета должно совпадать с именем папки, в которой хранится класс.


   Обычно в пакеты объединяют классы одной и той же категории, либо предоставляющие сходную функциональность.
  Таким образом можно группировать типы, что необходимо сразу для нескольких целей:
 
   - Существует специальный уровень доступа, позволяющий типам из одного пакета более тесно взаимодействовать друг с другом, чем с классами из других пакетов
 
   -    Организация классов в виде пакетов позволяет избежать конфликта имен между классами (когда разработчики называют свои классы одинаковыми именами).
      Каждый пакет имеет свое пространство имен, что позволяет создавать одноименные классы в различных пакетах.
 
   - С применением пакетов гораздо проще эффективно организовать взаимодействие подсистем друг с другом

 
   Подробнее о пакетах, подпакетах и их импорте (import) в Java можно прочитать здесь:



Что такое класс (class)
 
     Класс представляет собой контейнер, содержащий программный код.
   Код внутри класса представляет собой набор элементов - описание полей, констант, методов, интерфейсов и других классов.
   Класс - по сути является шаблоном (описанием) для объекта: он определяет, как объект будет выглядеть и какими функциями обладать.
   Класс представляется в исходном коде так:

   class ИмяКласса
{
Тело класса
} 

   Подробнее о классах в Java можно прочитать здесь:
 
 
Объект Java

   Объект - экземпляр класса. Каждый объект является объектом какого-то класса.
    Объекты возникают после запуска результатов компиляции и связывания исходного кода на выполнение.
   (Объект - сущность в адресном пространстве вычислительной систем, появляющаяся при создании экземпляра класса.)

   Класс - по сути является шаблоном (описанием) для объекта: он определяет, как объект будет выглядеть и какими функциями обладать.

   Рецепт (шаблон) выпечки пирожков можно назвать классом. Реально же существующий экземпляр данного класса (шаблона) - пирожок является объектом этого класса.
   Любой объект может обладать двумя основными характеристиками:
      - состояние (некоторые данные, которые хранит объект)
         Для хранения состояния объекта в классе применяются поля или переменные класса. 
      - поведение (действия, которые может совершать объект)
      Для определения поведения объекта в классе применяются методы.


Что такое метод

   Метод (функция) - это набор инструкций (команд), выполняемых программой, которому присвоили имя (имя метода).

   Код (тело) метода – это набор выражений (команд) (инструкций). Инструкции для метода должны быть размещены между его фигурными скобками - в "теле метода".

   Подробнее о методах можно прочитать здсь:


О командах

   Каждая команда описывает какое-то определённое действие.
   В конце каждой команды ставится точка с запятой.
   В круглых скобках после имени команды передаются её параметры.

   Примеры команд:
   System.out.print - команда, отвечающая за вывод сообщения на экран. Следующая команда после этой выведет сообщение на эту же строку.
   System.out.println - команда, отвечающая за вывод сообщения на экран с новой строки. Т.е. сначала выводит заданный текст, а потом делает перевод на новую строку. Следующая команда после этой выведет сообщение на новую строку.

   Пример записи команды в коде:
   System.out.println(10); Результат: выводит на экран число 10
   System.out.println("строка"); Результат: выводит на экран слово строка


Что такое интерфейсы

   Интерфейс – это скелет (заготовка) класса с перечислением необходимых методов, но без их кода.

   Интерфейс, подобно классу, можно рассматривать как контейнер, содержащий некоторые программные элементы, а именно, заголовки методов и константы.
   Интерфейсы невозможно запустить на выполнение: они, в отличие от классов, не могут содержать тел никаких методов, в том числе и метода main.
   Класс можно наследовать и использовать, а для интерфейса же нужно, чтобы кто-то создал класс, написав в нем тексты заявленных методов - только после этого он будет пригоден к использованию
   В остальном всё, что относится к классам, распространяется и на интерфейсы.
   К примеру, программный код интерфейсов также располагается в текстовых файлах с расширением .java, а сами интерфейсы могут быть помещены в пакеты.
   Также в результате компиляции для каждого интерфейса создаётся файл с расширением class, содержащий его байтовый код, а имя этого файла (без расширения) совпадает с именем интерфейса.

   В тексте класса, который реализует (имплементирует) интерфейс, должны быть написаны тексты всех методов, декларированных в этом интерфейсе.
   Класс может реализовывать сразу несколько интерфейсов. В этом случае они указываются через запятую после слова implements.
   Интерфейсы используют при разработке объемных программ большими коллективами: один программист может прописать несколько интерфейсов, а другие по его заданию подробно расписать классы, реализующие эти интерфейсы. Таким образом облегчается планирование работы и экономится время. 


Наследование в Java

   «родительское/дочернее»     Наследование (inheritance) - свойство системы, позволяющее описать (создать) новый класс на основе уже су...