Java — Самоучитель

  • 15. Java — Массивы
  • 16. Java — Дата и время
  • 17. Java — Регулярные выражения
  • 18. Java — Методы
  • 19. Java — Потоки ввода/вывода, файлы и каталоги
  • 18. Java — Методы

    Метод в Java — это комплекс выражений, совокупность которых позволяет выполнить определенную операцию. Так, например, при вызове метода System.out.println(), система выполняет ряд команд для выведения сообщения на консоль.

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

    Создание метода

    Ниже рассмотрен пример, иллюстрирующий синтаксис метода, как в Java создать метод.

    Синтаксис

    public static int methodName(int a, int b) {
       // тело
    }
    

    Где,

    • public static — модификатор;
    • int — возвращаемый тип;
    • methodName — имя метода;
    • a, b — формальные параметры;
    • int a, int b — перечень параметров.

    Определение метода представлено заголовком и телом метода. То же самое мы можем наблюдать в следующем синтаксисе создания метода.

    Синтаксис

    modifier returnType nameOfMethod (Parameter List) {
       // тело метода
    }
    

    Приведенный выше синтаксис включает:

    • modifier – определяет тип доступа для метода и возможность его использования.
    • returnType – метод может возвратить значение.
    • nameOfMethod – указывает имя метода. Сигнатура метода включает имя метода и перечень параметров.
    • Parameter List – перечень параметров представлен типом, порядком и количеством параметров метода. Данная опция задается произвольно, в методе может присутствовать нулевой параметр.
    • method body – тело метода определяет метод работы с командами.

    Пример

    Далее представлен исходный код рассмотренного выше метода, именуемого max(). Данный метод использует два параметра num1 и num2 и возвращает больший из двух.

    /* фрагмент кода возвращает минимальное между двумя числами */
    
    public static int minFunction(int n1, int n2) {
       int min;
       if (n1 > n2)
          min = n2;
       else
          min = n1;
    
       return min; 
    }
    

    Вызов метода

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

    Алгоритм вызова метода достаточно прост. Когда программа производит в Java вызов метода, программное управление передается вызванному методу. Данный вызванный метод затем возвращает управление вызывающему клиенту в двух случаях, если:

    • выполняется оператор возврата;
    • достигнута закрывающая фигурная скобка окончания метода.

    Метод возврата типа void производит вызов команды. Рассмотрим пример:

    System.out.println("Это proglang.su!");
    

    Метод возврата значения может быть проиллюстрирован следующим примером:

    int result = sum(6, 9);
    

    Пример ниже демонстрирует способ определения и вызова метода в Java.

    Пример

    public class ExampleMinNumber {
       
       public static void main(String[] args) {
          int a = 11;
          int b = 6;
          int c = minFunction(a, b);
          System.out.println("Минимальное значение = " + c);
       }
    
       /* Возвращает минимум из двух чисел */
       public static int minFunction(int n1, int n2) {
          int min;
          if (n1 > n2)
             min = n2;
          else
             min = n1;
    
          return min; 
       }
    }
    
    

    В итоге будет получен следующий результат:

    Минимальное значение = 6
    

    Ключевое слово void

    Ключевое слово void в Java позволяет нам создать методы, не производящие возврат значения. В примере, расположенном далее, нами был рассмотрен метод типа void – methodRankPoints. Методы типа void в Java не производят возврат каких-либо значений. Вызов метода типа void выполняется командой, т.е. methodRankPoints(255.7);. Это java-выражение, которое оканчивается точкой с запятой, как показано в примере ниже:

    Пример

    public class ExampleVoid {
    
       public static void main(String[] args) {
          methodRankPoints(255.7);
       }
    
       public static void methodRankPoints(double points) {
          if (points >= 202.5) {
             System.out.println("Ранг A1");
          }else if (points >= 122.4) {
             System.out.println("Ранг A2");
          }else {
             System.out.println("Ранг A3");
          }
       }
    }
    

    В итоге будет получен следующий результат:

    Ранг A1
    

    Передача параметров по значению в Java

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

    В Java передача параметров по значению обозначает вызов метода с параметром. За счет этого производится передача значения аргумента параметру.

    Пример

    Следующая программа демонстрирует пример передачи параметра по значению. Значения аргументов остаются неизменными даже после вызова метода.

    public class swappingExample {
    
       public static void main(String[] args) {
          int a = 30;
          int b = 45;
          System.out.println("Перед тем как передать, значения аргументов a = " + a + " и b = " + b);
    
          // Вызов метода передачи
          swapFunction(a, b);
          System.out.println("\nСейчас, до и после передачи значения аргументов ");
          System.out.println("остались неизменными, a = " + a + " и b = " + b);
       }
    
       public static void swapFunction(int a, int b) {
          System.out.println("До замены: a = " + a + " b = " + b);
          
          // Передача параметров
          int c = a;
          a = b;
          b = c;
          System.out.println("После замены: a = " + a + " b = " + b);
       }
    }
    

    Получим следующий результат:

    Перед тем как передать, значения аргументов a = 30 и b = 45
    До замены: a = 30 b = 45
    После замены: a = 45 b = 30
    
    Сейчас, до и после передачи значения аргументов 
    остались неизменными, a = 30 и b = 45
    

    Перегрузка методов

    Перегрузка методов в Java — случай, когда в классе присутствуют два и более метода с одинаковым именем, но различными параметрами. Данный процесс отличен от переопределения методов. При переопределении методов, метод характеризуется аналогичным именем, типом, числом параметров и т.д.

    Рассмотрим пример, который был представлен выше при определении минимальных чисел целочисленного типа. Так допустим, мы хотим определить минимальное число двойного типа. В данном случае будет представлена концепция перегрузки для создания двух и более методов с одинаковым именем, но различными параметрами.

    Рассмотренный пример поясняет вышесказанное.

    Пример

    public class ExampleOverloading {
    
       public static void main(String[] args) {
          int a = 7;
          int b = 3;
          double c = 5.1;
          double d = 7.2;
          int result1 = minFunction(a, b);
          
          // такая же функция с другими параметрами
          double result2 = minFunction(c, d);
          System.out.println("Минимальное значение = " + result1);
          System.out.println("Минимальное значение = " + result2);
       }
    
       // для integer
       public static int minFunction(int n1, int n2) {
          int min;
          if (n1 > n2)
             min = n2;
          else
             min = n1;
    
          return min; 
       }
       
       // для double
       public static double minFunction(double n1, double n2) {
         double min;
          if (n1 > n2)
             min = n2;
          else
             min = n1;
    
          return min; 
       }
    }
    

    В итоге будет получен следующий результат:

    Минимальное значение = 3
    Минимальное значение = 5.1
    

    Методы перегрузки делают программу читаемой. Таким образом, представлены два метода с одинаковым именем, но различными параметрами. В результате чего мы получили минимальные int число и число double типа.

    Использование аргументов командной строки

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

    В Java аргумент командной строки представляет информацию, которая напрямую следует за именем программы в командной строке при ее выполнении. Получение доступа к аргументам командной строки в java-программе не представляет сложности. Они хранятся в виде строки в массиве строк, переданном в main().

    Пример

    Программа ниже отображает все вызванные аргументы командной строки.

    public class CommandLine {
    
       public static void main(String args[]) { 
          for(int i = 0; i < args.length; i++) {
             System.out.println("args[" + i + "]: " +  args[i]);
          }
       }
    }
    

    Попробуйте выполнить данную программу, как показано далее:

    $java CommandLine это командная строка 300 -200
    

    В итоге будет получен следующий результат:

    args[0]: это
    args[1]: командная
    args[2]: строка
    args[3]: 300
    args[4]: -200
    

    Конструктор в Java

    В Java конструктор инициализирует объект при его создании. Его имя аналогично имени класса, а синтаксис сходен с синтаксисом метода. Однако, в отличие от последнего, в конструкторе отсутствует возвращаемое значение.

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

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

    Пример

    В примере ниже рассмотрено использование конструктора класса без параметров.

    // Простой конструктор.
    class MyClass {
       int x;
    
       // Далее следует конструктор
       MyClass() {
          x = 10;
       }
    }
    

    Для инициализации объектов вам необходимо выполнить вызов конструктора согласно следующему примеру.<\p>

    public class ConsDemo {
    
       public static void main(String args[]) {
          MyClass t1 = new MyClass();
          MyClass t2 = new MyClass();
          System.out.println(t1.x + " " + t2.x);
       }
    }
    

    Получим результат:

    10 10
    

    Параметризованный конструктор

    Чаще всего вам может понадобиться конструктор, который принимает один и более параметров. Добавление параметров к конструктору аналогично их добавлению в метод, следует только внести их в круглые скобки после имени конструктора.

    Пример

    Далее рассмотрен простой пример использования конструктора с параметром.

    // Простой конструктор.
    class MyClass {
       int x;
       
       // Ниже конструктор
       MyClass(int i) {
          x = i;
       }
    }
    

    С целью инициализации объектов вам понадобится вызвать конструктор согласно следующему примеру.

    public class ConsDemo {
    
       public static void main(String args[]) {
          MyClass t1 = new MyClass( 10 );
          MyClass t2 = new MyClass( 20 );
          System.out.println(t1.x + " " + t2.x);
       }
    }
    

    Получим следующий результат:

    10 20
    

    Ключевое слово this

    Ключевое слово this — используется для ссылки на текущий класс с учетом метода или конструктора экземпляра. Используя this в Java, Вы можете ссылаться на экземпляры класса, такие как конструкторы, переменные и методы.

    Примечание: ключевое слово this используется только в составе методов либо конструкторов экземпляра.

    Java this, ключевое слово this в Java, ключевое слово this, this, Java

    Как правило, ключевое слово this в Java используется для:

    • дифференцирования между переменными экземпляра и локальными переменными в случае, если у них одинаковые имена, в составе конструктора или метода.
    class Student {
       int age;   
       Student(int age) {
          this.age = age;	
       }
    }
    
    • вызова конструктора одного типа (параметризованного конструктора либо конструктора по умолчанию) из другого в составе класса. Данный процесс также носит название явного вызова конструктора.
    class Student {
       int age
       Student() {
          this(20);
       }
       
       Student(int age) {
          this.age = age;	
       }
    }
    

    Пример

    Далее представлен пример, в котором ключевое слово this используется для доступа к экземплярам класса. Необходимо копировать и вставить данную программу в файл с названием This_Example.java.

    public class This_Example {
       // Инициализация переменной num
       int num = 11;
    	
       This_Example() {
          System.out.println("Это пример программы с ключевым словом this");	
       }
    
       This_Example(int num) {
          // Вызов конструктора по умолчанию
          this();
          
          // Присвоение локальной переменной num переменной экземпляра num
          this.num = num;	   
       }
       
       public void greet() {
          System.out.println("Привет! Добро пожаловать на ProgLang!");
       }
          
       public void print() {
          // Локальная переменная num
          int num = 20;
          
          // Вызов метода класса greet
          this.greet(); 
    
          // Вывод локальной переменной.
          System.out.println("Значение локальной переменной num: " + num);
          
          // Вывод переменной экземпляра.
          System.out.println("Значение переменной экземпляра num: " + this.num);          
       }
       
       public static void main(String[] args) {
          // Инициализация класса
          This_Example obj1 = new This_Example();
          
          // Вызов метода print
          obj1.print();
    	  
          // Передача нового значения переменной num через параметризованный конструктор
          This_Example obj2 = new This_Example(30);
          
          // Вызов снова метода print
          obj2.print(); 
       }
    }
    

    В итоге будет получен следующий результат:

    Это пример программы с ключевым словом this
    Привет! Добро пожаловать на ProgLang!
    Значение локальной переменной num: 22
    Значение переменной экземпляра num: 11
    Это пример программы с ключевым словом this
    Привет! Добро пожаловать на ProgLang!
    Значение локальной переменной num: 22
    Значение переменной экземпляра num: 30
    

    Аргументы переменной (var-args)

    JDK 1.5 позволяет вам передавать переменное число аргументов одного и того же типа в метод. Параметр в методе объявляется следующим образом:

    typeName... parameterName
    

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

    Пример

    public class VarargsDemo {
    
       public static void main(String args[]) {
          // Вызов метода с переменной args  
          printMax(27, 11, 11, 5, 77.1);
          printMax(new double[]{10, 11, 12, 77, 71});
       }
    
       public static void printMax(double... numbers) {
          if (numbers.length == 0) {
             System.out.println("Ни один аргумент не передается");
             return;
          }
    
          double result = numbers[0];
    
          for (int i = 1; i <  numbers.length; i++)
          if (numbers[i] >  result)
          result = numbers[i];
          System.out.println("Максимальное значение " + result);
       }
    }
    

    В итоге будет получен следующий результат:

    Максимальное значение 77.1
    Максимальное значение 77.0
    

    Метод finalize()

    Метод finalize() — метод, который будет вызываться непосредственно перед окончательным уничтожением объекта сборщиком мусора. (финализатором). В Java finalize() может быть использован для обеспечения чистого завершения объекта.

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

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

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

    В общем виде метод finalize() выглядит следующим образом:

    protected void finalize() {
       // здесь финализация кода
    }
    

    Здесь ключевое слово protected представляет спецификатор, предотвращающий доступ к finalize() посредством кода, определяемого вне его класса.

    Это свидетельствует о том, что вы не можете знать как или даже когда будет производиться выполнение finalize(). К примеру, если ваша программа будет окончена до «сборки мусора», finalize() не будет выполняться.

    Поделитесь:

    О сайте

    Все материалы сайта proglang.su являются результатом труда его авторов. Копирование материалов в некоммерческих целях без указания источника в виде прямой ссылки на сайт proglang.su запрещено. Использование материалов в коммерческих целях разрешено только с письменного согласия автора. Нарушение авторских прав преследуется по закону. Мы это делаем, чтобы защитить плоды своих трудов от воровства. © 2014-2017

    Присоединяйтесь


    Обратная связь