<<Предыдущий урок   Список уроков   Следующий урок>>

Методы в Java

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

Методы определяются всегда внутри классов:

public class Main {
    public static void foo() {
        // Тело метода
    }
}

foo -  это метод, который мы определили в классе Main, давайте его рассмотрим.

  • public — тип доступа (метод может вызываться из другого класса). Существуют и другие типы доступа, к примеру private (метод доступен только внутри класса) и protected (о нем мы будем говорить позже).
  • static  означает что  метод статический, он принадлежит классу Main, а не конкретному экземпляру класса Main. Мы можем вызвать этот метод из другого класса так:  Main.foo().
  • void значит, что этот метод не возвращает значение. Методы могут возвращать значение в Java и оно должно быть определено при объявлении метода. Однако, вы можете использовать return просто для выхода из метода.
  • Этот метод не получает никаких аргументов, но методы java могут получать аргументы, как мы увидим далее на примерах.

Если тип возвращаемого значения не void, в теле метода должен быть хотя бы один оператор

return выражение;
где тип выражения должен совпадать с типом возвращаемого значения. Этот оператор возвращает результат вычисления выражения в точку вызова метода.
Если тип возвращаемого значения – void, возврат из метода выполняется либо после выполнения последнего оператора тела метода, либо в результате выполнения оператора
return;
(таких операторов в теле метода может быть несколько).
Пример объявления метода, возвращающего значение типа int – сумму двух своих параметров типа int:

int sum(int a, int b){
      int x;
      x = a + b;
      return x;
}

При вызове метода, например, sum(5, 3), параметры 5 и 3 передаются в метод, как значения соответственно a и b, и оператор вызова метода sum(5, 3)– заменяется значением, возвращаемым методом (8).

В отличие от языка C, в котором тип параметра, задаваемого при вызове, приводится к типу параметра в объявлении функции, тип задаваемого параметра в Java должен строго соответствовать типу параметра в объявлении метода, поэтому вызов метода sum(1.5, 8) приведет к ошибке при компиляции программы.

Не статические методы

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

Не статические методы могут получать доступ и изменять поля объекта.

public class Student {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Вызов методов требует экземпляра класса Student.

Student s = new Student();
s.setName("Danielle");
String name = s.getName();

Student.setName("Bob"); // Не будет работать!
Student.getName(); // Не будет работать!

Перегруженные методы

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

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

Например, метод

double sum(double a, double b) {
     double x;
     x = a + b;
     return x;
}

вместе с объявленным ранее методом int sum(int a, int b)составляют пару перегруженных методов и при вызове sum(5, 8) будет вызван первый метод, а при вызове sum(5.0, 8.0) будет вызван второй метод.

По умолчанию метод, как и переменная, доступен только классам в том же пакете (наборе классов), что и исходный класс. Если перед возвращаемым типом задан модификатор доступа public, то метод является глобальным и доступен любым объектам, а модификатор private означает, что метод доступен в том классе, в котором он был объявлен, т.е. метод инкапсулирован в данном классе.

Переопределение методов

Кроме перегрузки существует также замещение, или переопределение методов (англ. overriding). Замещение происходит, когда класс потомок (подкласс) определяет некоторый метод, который уже есть в родительском классе(суперклассе), таким образом новый метод заменяет метод суперкласса.  У нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса.

public class Thought {
    public void message() {
        System.out.println("Я себя чувствую как стрекоза, попавшая в параллельную вселенную.");
    }
}
 
public class Advice extends Thought {
    @Override  // Аннотация @Override с Java 5 является необязательной, но весьма полезной
    public void message() {
        System.out.println("Внимание: Даты в календаре ближе, чем кажутся.");
    }
}

Класс Thought представляет собой суперкласс и обеспечивает вызов метода message(). Подкласс, называемый Advice, наследует каждый метод класса Thought. Однако, класс Advice переопределяет метод message(), замещая функционал, описанный в классе Thought.

В Java, когда подкласс содержит метод, переопределяющий метод суперкласса, то он может помимо своего метода вызывать и метод суперкласса при помощи ключевого слова super.
Например, нижеследующий вариант выводит оба сообщения при вызове метода подкласса:

public class Advice extends Thought {
      @Override
      public void message() {
          System.out.println("Внимание: Даты в календаре ближе, чем кажутся.");
          super.message();  // Вызов версии метода родительского класса
      }
  }

Существуют методы, которые подкласс не может переопределять. Например, в Java метод, объявленный с ключевым словом final, не может быть переопределён. Методы, объявленные как private или static не могут быть переопределены, поскольку это соответствует неявному использованию final.

 Резюме

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

Упражнение

Написать метод printFullName класса Student, который выводит полное ФИО студента.

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

Дополнительное чтение:

Методы в Java


<<Предыдущий урок   Список уроков   Следующий урок>>


admin

Обучающие видео-уроки по разработке приложений для операционной системы Android. Мы поможем любому новичку стать продвинутым разработчиком андроид-приложений!

25 комментариев

Аноним · 04.07.2015 в 20:58

Т.е. в связке с методом печатающим ФИО требуется метод, устанавливающий Фамилию и Отчество по аналогии с назначением имени и потом метод, который «цепляет» эти параметры и выводит их?

Аноним · 04.07.2015 в 21:35

Получилось, только такое:
public class Student {
String name;
String surname;
String patronomic;
public void printFullName(){
System.out.println(«name: » + name);
System.out.println(«surname » + surname);
System.out.println(«patronomic» + patronomic);
} /* определил метод */
public static void main (String args[]){
Student S2 = new Student();
S2.name = «JOOORA»;
S2.surname = «KURZAAAAANOOOV»;
S2.patronomic = «VACHESLAVOVICH»;
S2.printFullName();

}
}

Lain · 09.07.2015 в 06:46

public class Student {
private String firstName;
private String lastName;

public static void main(String[] args) {
Student c = new Student();
c.setFirstName(«Ivan»);
c.setLastName(«Grigoriev»);
c.printFullName();
}

public void setFirstName(String name){
firstName = name;
}
public void setLastName(String name){
lastName = name;
}
public void printFullName(){
String fullName;
fullName = firstName + » » + lastName;
System.out.println(fullName);
}
}

Yakov Veber · 01.08.2015 в 23:12

public class Student {
private static String name;
private static String lastname;
private static String family;
public static void FOQ(){
System.out.print(name + » «);
System.out.print(lastname + » «);
System.out.print(family);
}
public static void setFOQ(String n,String ln, String fn){
name = n;
lastname = ln;
family = fn;

Андрей Иванов · 19.08.2015 в 12:16

Что ж язык изложения стал такой сложный. Материал бы лучше усваивался, еслибы язык изложения был более человечный. Слишком много терминов, о которых не говорилось в предыдущих уроках. И это очень усложняет понимание.

Андрей Иванов · 19.08.2015 в 15:32

public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

Зачем здесь (private String name;) указано private ? Вроде бы без него все работает.

theGhoul · 28.08.2015 в 14:06

class test {
public static void main(String args[]) {
String name1 = «Jack»;
String name2 = «Daniel»;
String fullname = fname(name1, name2);
System.out.println(fullname);
}
private static String fname(String n1, String n2) {
n1 = n1 + » » + n2;
return n1;
}
}

Разобрался только посмотрев другой урок про методы:(

#5. Вводный курс по JAVA. Циклы (Loops) | fanDROID.info · 25.05.2015 в 03:37

[…] Выполните упражнение, прежде чем перейти к следующему уроку. […]

Туториал по основам языка программирования JAVA для начинающих | fanDROID.info · 30.05.2015 в 20:52

[…] Pingback: #6. Вводный курс по JAVA. Методы | fanDROID.info […]

#7. Вводный курс по JAVA. Объекты | fanDROID.info · 22.06.2015 в 18:25

[…] < Предыдущий урок       Список уроков […]

Добавить комментарий

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