#6. Вводный курс по JAVA. Методы

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

Методы в 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


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

Коментарі: 28
  1. Vlaker

    class Student {
    private String FName, SName, TName;

    Student(String F, String S, String T) {
    FName = F;
    SName = S;
    TName = T;
    }

    public void PrintFullName() {
    System.out.println(FName+” “+SName+” “+TName);
    }
    }

    public class Main {

    public static void main(String[] args) {
    Student S = new Student(“Ivanov”, “Ivan”, “Ivanovich”);
    S.PrintFullName();
    }
    }

  2. timofey

    public class Main {

    public static class Student {
    private String famyli;
    private String name;
    private String otchestvo;
    private String setFIO() {
    String fio = (famyli + ” ” + name + ” ” + otchestvo);
    System.out.println(fio);
    return fio;
    }
    public void setFamyli(String famyli) {
    this.famyli = famyli;
    }
    public void setName(String name) {
    this.name = name;
    }
    public void setOtchestvo(String otchestvo) {
    this.otchestvo = otchestvo;
    }
    }

    public static void main(String[] args) {
    Student s = new Student();
    s.setFamyli(“фамилия”);
    s.setName(“имя”);
    s.setOtchestvo(“отчество”);
    s.setFIO();
    }
    }

  3. tester

    public class Student {
    public static void printFullName() {
    String f = “Фамилия”;
    String i = “Имя”;
    String o = “Отчество”;
    System.out.println(f+” “+i+” “+o);
    }
    }

    И в Main классе вызываем этот метод:
    Student.printFullName();

  4. dendi135

    Я конечно не эксперт, но зачем коды такие длинные писать?

    public class Student {
    private String Name = "Максим", SurName = "Бурко", Batya = "Олегович";

    public static void main(String[] agrs) {
    Student s = new Student();
    s.printFullName();
    }

    void printFullName () {
    System.out.println(SurName + " " + Name + " " + Batya);
    }
    }

  5. package com.example.proekt_uchebniy;

    public class PrivetMir {
    public static void main(String[] args) {
    printFullName();
    }
    public static class Student{
    public String name,famil,otchestvo;
    public void setName(String name){
    this.name = name;
    }
    public void setFamil(String famil){
    this.famil = famil;
    }
    public void setOtchestvo(String otchestvo){
    this.otchestvo = otchestvo;
    }
    public String getName(){
    return name;
    }
    public String getFamil(){
    return famil;
    }
    public String getOtchestvo(){
    return otchestvo;
    }
    }
    public static void printFullName(){
    Student student1 = new Student();
    student1.setName(“Vladislav”);
    student1.setFamil(“Nikonov”);
    student1.setOtchestvo(“Alekseevich”);
    String name = student1.getName();
    String famil = student1.getFamil();
    String otchestvo = student1.getOtchestvo();
    System.out.print(“Hello! I am ” + famil +” ” + name +” “+ otchestvo + ” , and i am student!”);
    }

    }

  6. Darvin3310

    public class MyJavaClass {
    public static class Student {
    String name;
    String surname;
    String patronymic;
    }
    public static void main(String[] args) {
    System.out.println(printFullName());
    }

    public static String printFullName() {
    Student d2 = new Student();
    d2.name = “Alex”;
    d2.surname = “Shikura”;
    d2.patronymic = “Uriyovic”;
    return(d2.name + ” ” + d2.surname + ” ” + d2.patronymic);
    }
    }

  7. gargul_rus

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

    public class Student {
    String fio;
    String fio2;
    String fio3;
    String fio4;
    public void printFullName(){
    System.out.println(“ФИО Студента: ” + fio);
    System.out.println(“ФИО Студента: ” + fio2);
    System.out.println(“ФИО Студента: ” + fio3);
    System.out.println(“ФИО Студента: ” + fio4);
    }
    public static void main (String args []) {
    Student Stu = new Student();
    Stu.fio = “Иванов Иван Иванович”;
    Stu.fio2 = “Павлов Анатолий Анатольевич”;
    Stu.fio3 = “Поджог Сараев Рулонов”;
    Stu.fio4 = “Рулон Обоев Поджогов”;
    Stu.printFullName();
    }
    }

  8. Константин

    Вариант покороче:

    public class Main {
    public static void main(String[] args) {
    Student a = new Student();
    System.out.println(a.printFullName("dfsf","sadasd","asdasd")); //вводим три параметра: Фамилию Имя Отчество
    }
    }

    public class Student{
    public String printFullName(String family, String name, String soname) {
    return "Фамилия Имя Отчество: " + (family + " " + name + " " + soname);
    }
    }

  9. Константин

    Я сделал вот так:
    public class Student{
    public String name, soname, family;
    public String printFullName(){
    return "Фамилия Имя Отчество: " + (family + " " + name +" "+ soname);
    }
    }

    public class Main {
    public static void main(String[] args) {
    Student a = new Student();
    a.name = "Константин"; //Вводится Имя
    a.soname = "Константинович"; //Вводится отчество
    a.family = "Головенков"; //Вводится Фамилия
    System.out.println(a.printFullName());
    }
    }

  10. Liuboff

    class Student {
    private String firstName;
    private String lastName;
    public Student(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
    }
    public void printFullName(){

    System.out.print(firstName+” “);

    System.out.println(lastName);}
    }

    public class Main {
    public static void main(String[] args) {
    Student[] students = new Student[] {
    new Student(“Morgan”, “Freeman”),
    new Student(“Brad”, “Pitt”),
    new Student(“Kevin”, “Spacey”),
    };
    for (Student s : students) {
    s.printFullName();}
    }}

  11. Александр

    Создал классы: Main, Student, Surname, Name, Middle_name.

    Класс Main (Выводи полное ФИО):
    public class Main {
    public static void main(String[] args) {

    Student a = new Student();
    a.printFullName();
    }
    }
    Класс Student, метод printFullName (объединяет классы Surname, Name, Middle_name):
    public class Student {
    public void printFullName(){

    Surname a = new Surname();
    a.setsurname(“Kataev”);
    String surname = a.getsurname();
    System.out.println(surname);

    Name b = new Name();
    b.setname(“Aleksandr”);
    String name = b.getname();
    System.out.println(name);

    Middle_name c = new Middle_name();
    c.setmiddle_name(“Vladislavovich”);
    String middle_name = c.getmiddle_name();
    System.out.println(middle_name);
    }
    }
    Класс Surname:
    public class Surname {
    public String surname;
    public String getsurname(){
    return surname;
    }
    public void setsurname (String surname){
    this.surname = surname;
    }
    }
    Класс Name:
    public class Name {
    public String name;
    public String getname(){
    return name;
    }
    public void setname (String name){
    this.name = name;
    }
    }
    Класс Middle_name:
    public class Middle_name {
    private String middle_name;
    public String getmiddle_name() {
    return middle_name;
    }

    public void setmiddle_name(String middle_name) {
    this.middle_name = middle_name;
    }
    }

  12. J2a

    Я так написал. Чувствую, что задание вроде не реализованной на 100%, но я понял его так..

    public class Program
    {
    public static void main(String[] args) {
    printFullName(“FirstName”, “Name”, “LastName”);
    }
    public static void printFullName(String a, String b, String c){
    System.out.println(a + ” ” + b + ” ” + c);

    }
    }

  13. Андрей

    Я сделал таким путьом…
    Может не совсем верно… Подскажите.

    public class Main {
    public static void main(String args[]){
    Student fio;
    fio = new Student ();
    fio.name = “Андрей”;
    fio.famili = “Фамилия”;
    fio.ot = “Васильевич”;
    System.out.print (fio.name);
    System.out.print (” “);
    System.out.print(fio.ot);
    System.out.print (” “);
    System.out.println(fio.famili);
    }
    }

  14. Victor

    Благодарствую за подсказки ребят выше, испробовал 2 способа изменения ФИО в Student:
    1. Обращение к приватным переменным fam\name\sur через сеттеры.
    2. Обращение напрямую к публичным переменным fam2\name2\sur2

    public class Student {
    private String fam;
    private String name;
    private String sur;

    String fam2;
    String name2;
    String sur2;

    public void setFam(String a){
    this.fam = a;
    }
    public void setName(String a){
    this.name = a;
    }
    public void setSur(String a){
    this.sur = a;
    }

    public void printFullName(){
    System.out.println(fam);
    System.out.println(name);
    System.out.println(sur);
    }

    public void printFullName2(){
    System.out.println(fam2);
    System.out.println(name2);
    System.out.println(sur2);
    }

    }

    public class Main {

    public static void main(String[] args){

    Student s = new Student();

    s.setFam("Онищенко");
    s.setName("Игорь");
    s.setSur("Сергеевич");

    s.fam2 = "Иванов";
    s.name2 = "Иван";
    s.sur2 = "Иванович";

    s.printFullName();
    s.printFullName2();

    }

    }

  15. igor

    public class student {
    public String printFullName(){
    String FullName = (famil+” “+name+” “+otch);
    return FullName;
    }
    private String name;
    public String getName(){
    return name;
    }
    public void setName(String name){
    this.name = name;
    }
    private String famil;
    public String getFamil(){
    return famil;
    }
    public void setFamil(String famil){
    this.famil = famil;
    }
    private String otch;
    public String getOtch(){
    return otch;
    }
    public void setOtch(String otch){
    this.otch = otch;
    }
    }

    public class main {
    public static void main(String[] args){
    student s = new student();
    s.setName(“Igor”);
    s.setFamil(“Rymarev”);
    s.setOtch(“Igorevich”);
    String fio = s.printFullName();
    System.out.println(fio);
    }
    }

  16. Я не понял почему программа начала выполнять метод main? Где вызов этого метода?

    1. admin (автор)

      Метод main является точкой входа в java-программу и вызывается виртуальной машиной

  17. Всё нормально излагается. Больше читайте и больше пишите

  18. theGhoul

    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;
    }
    }

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

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

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

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

  21. 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;

  22. Lain

    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);
    }
    }

  23. Получилось, только такое:
    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();

    }
    }

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

Додати коментар