Функции


В Java все определения функций должны находиться внутри классов. Мы также вызываем методы функций. Давайте посмотрим на пример метода

public class Main {
    public static void foo() {
        // Do something here
    }
}

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

  • staticозначает, что этот метод принадлежит классу Main, а не конкретному экземпляру Main. Это означает, что мы можем вызывать метод из другого такого класса .Main.foo()
  • voidозначает, что этот метод не возвращает значение. В Java методы могут возвращать одно значение, и оно должно быть определено в объявлении метода. Однако вы можете использовать returnсамо по себе для выхода из метода.
  • Этот метод не получает аргументов, но, конечно, методы Java могут получать аргументы, как мы увидим дальше.

Аргументы

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

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

public void bar(int num1, int num2) {
    ...
}

Вот еще одно место в коде, где называется bar

int a = 3;
int b = 5;
bar(a, b);

Вы можете себе представить, что когда он запущен, это похоже на то, что в начале написаны следующие две строки:bar(a, b)bar

int num1 = a;
int num2 = b;

И только после этого выполняется остальная часть метода.

Это означает, что aзначение будет скопировано num1и bзначение будет скопировано num2. Изменение значений num1и num2не повлияет на aи b.

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

public void bar2(Student s1, Student s2) {
    ...
}

И вот как мы это используем

Student joe = new Student("joe");
Student jack = new Student("jack");
bar2(joe, jack);

Снова мы можем изобразить те же две строки в начале bar2

Student s1 = joe;
Student s2 = jack;

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

s1.setName("Chuck"); // joe name is now Chuck as well
s1 = new Student("Norris"); // s1 is a new student, different than joe with the name of Norris
// s1 == joe   is not true anymore

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

Нестатические методы в 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"); // Will not work!
Student.getName(); // Will not work!

Резюме

  • Каждый метод Java должен быть внутри класса
  • Статические методы принадлежат классу, а нестатические методы принадлежат объектам
  • Все параметры в функции передаются по значению, содержимое примитивов копируется, в то время как объекты не копируются, а некоторые говорят «передано по ссылке».

Упражнение

Напишите метод printFullNameученика, который печатает полное имя ученика.