Как вызвать метод из другого класса java
Перейти к содержимому

Как вызвать метод из другого класса java

  • автор:

Method References

You use lambda expressions to create anonymous methods. Sometimes, however, a lambda expression does nothing but call an existing method. In those cases, it’s often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.

Consider again the Person class discussed in the section Lambda Expressions:

Suppose that the members of your social networking application are contained in an array, and you want to sort the array by age. You could use the following code (find the code excerpts described in this section in the example MethodReferencesTest ):

The method signature of this invocation of sort is the following:

Notice that the interface Comparator is a functional interface. Therefore, you could use a lambda expression instead of defining and then creating a new instance of a class that implements Comparator :

However, this method to compare the birth dates of two Person instances already exists as Person.compareByAge . You can invoke this method instead in the body of the lambda expression:

Because this lambda expression invokes an existing method, you can use a method reference instead of a lambda expression:

The method reference Person::compareByAge is semantically the same as the lambda expression (a, b) -> Person.compareByAge(a, b) . Each has the following characteristics:

  • Its formal parameter list is copied from Comparator<Person>.compare , which is (Person, Person) .
  • Its body calls the method Person.compareByAge .

Kinds of Method References

There are four kinds of method references:

Kind Syntax Examples
Reference to a static method ContainingClass::staticMethodName Person::compareByAge
MethodReferencesExamples::appendStrings
Reference to an instance method of a particular object containingObject::instanceMethodName myComparisonProvider::compareByName
myApp::appendStrings2
Reference to an instance method of an arbitrary object of a particular type ContainingType::methodName String::compareToIgnoreCase
String::concat
Reference to a constructor ClassName::new HashSet::new

The following example, MethodReferencesExamples , contains examples of the first three types of method references:

All the System.out.println() statements print the same thing: Hello World!

BiFunction is one of many functional interfaces in the java.util.function package. The BiFunction functional interface can represent a lambda expression or method reference that accepts two arguments and produces a result.

Reference to a Static Method

The method references Person::compareByAge and MethodReferencesExamples::appendStrings are references to a static method.

Reference to an Instance Method of a Particular Object

The following is an example of a reference to an instance method of a particular object:

The method reference myComparisonProvider::compareByName invokes the method compareByName that is part of the object myComparisonProvider . The JRE infers the method type arguments, which in this case are (Person, Person) .

Similarly, the method reference myApp::appendStrings2 invokes the method appendStrings2 that is part of the object myApp . The JRE infers the method type arguments, which in this case are (String, String) .

Reference to an Instance Method of an Arbitrary Object of a Particular Type

The following is an example of a reference to an instance method of an arbitrary object of a particular type:

The equivalent lambda expression for the method reference String::compareToIgnoreCase would have the formal parameter list (String a, String b) , where a and b are arbitrary names used to better describe this example. The method reference would invoke the method a.compareToIgnoreCase(b) .

Similarly, the method reference String::concat would invoke the method a.concat(b) .

Reference to a Constructor

You can reference a constructor in the same way as a static method by using the name new . The following method copies elements from one collection to another:

The functional interface Supplier contains one method get that takes no arguments and returns an object. Consequently, you can invoke the method transferElements with a lambda expression as follows:

You can use a constructor reference in place of the lambda expression as follows:

The Java compiler infers that you want to create a HashSet collection that contains elements of type Person . Alternatively, you can specify this as follows:

java calling a method from another class

I am working on a problem and I am very stuck because I am just starting to learn java. Any help I can get to understand this would be great. I have to write a program that has two classes. The main class will read from a file and uses the second class to find how may times the same words have been repeated in the file and add them to an array that contans the words and number of times the word repeated. I am ok with the reading the file part. I just can’t seem to wrap my head around how to call a method from the second class to add the word into the array and increment the counter. Here is my code so far if you run it you will see how new I am to this by how many errors you will get.

2 Answers 2

You’re very close. What you need to remember is when you’re calling a method from another class you need to tell the compiler where to find that method.

So, instead of simply calling addWord(«someWord») , you will need to initialise an instance of the WordList class (e.g. WordList list = new WordList(); ), and then call the method using that (i.e. list.addWord(«someWord»); .

However, your code at the moment will still throw an error there, because that would be trying to call a non-static method from a static one. So, you could either make addWord() static, or change the methods in the Words class so that they’re not static.

My bad with the above paragraph — however you might want to reconsider ProcessInput() being a static method — does it really need to be?

Методы Java: как их вызывать и использовать

Блок кода с именем, объявление которого происходит внутри класса, называется метод. Этот блок может быть использован много раз. Тем, кому доводилось иметь дело с процедурным программированием, например, работать на Pascal, Модула-2, Fortran или Basic, могут сравнить принцип работы метода с функцией.

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

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

Методы Java: как их вызывать и использовать

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

Важный момент, о котором нельзя забывать это о поле out у класса System, которое является потоком ввода/вывода.

Java-приложение должно быть работоспособным, в связи с этим в своем базовом классе оно обязательно должно иметь объявленный метод main.

public static void main(String[] args) <
// здесь основной код и вызовы других методов
>

Здесь мы можем наблюдать, как main принимает массив строк. В этом конкретном случае это — параметры запуска.

Методы Java: как их вызывать и использоватьМетоды Java: как их вызывать и использовать

Объявление и определение

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

Вот элементарный пример, где задача метода — обнаружить среди пары чисел большее. Для примера был использован тип int, так как мы будем работать с целыми числами.

public static int maxFinder(int a, int b) < //заголовок метода
//ниже — тело метода
int max;
if (a < b)
max = b;
else
max = a;
return max;
>

Как мы можем понять, первое, что идет в заголовке — модификаторы. Они должны диктовать условия, согласно которым метод может быть вызван. Давайте рассмотрим, что означают элементы заголовка: int — это возвращаемый тип, maxFinder — это имя метода. Нам еще нужны параметры, которые мы указываем в скобках.

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

К слову, return способен взаимодействовать с выражением, а не только с переменной. Если бы это было конечной целью, то мы получили бы такую строку кода:

Еще два замечания. Мы ставим void, если не предполагается, чтобы метод что-нибудь возвращал. Также мы ничего не пишем в скобках, если входящие параметры вообще не нужны:

static void theWarning() <
System.out.println(«Мне ничего не надо, и вы от меня ничего не получите.»);
>

Методы Java: как их вызывать и использовать

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

Как мы уже говорили выше, метод по своей сути — имя для действия: встать, идти, удалить информацию. Имена при создании кода применяют, в том числе, для упрощения понимания. Программисту нужно четко сформулировать логику, чтобы приложение работало корректно. Программе все равно, какое у метода имя. В первую очередь, понятные названия методов нужны для разработчиков и других «пользователей» кода.

Бывают моменты, когда одно и то же слово может означать разные объекты или действия. Например, «вымыть пол» и «вымыть машину» — это разные действия с одинаковым словом. Написать что-то вроде «половымыть пол» или «машиновымыть машину» — нецелесообразно. Мы делаем методы с одинаковыми именами, но у них должны быть разные наборы аргументов.

Java относится к тем языкам программирования, в которых мы можем создавать какое-то количество методов с одинаковым именем в одном классе. Основное — их параметры должны отличаться по типу или количеству аргументов.

Для примера давайте создадим класс Cat, где будет набор перегруженных методов:
class Cat <
void meow() <
// параметры отсутствуют
>
void meow(int count) <
// используется один параметр типа int
>
void meow(int count, int pause) <
// используются два параметра типа int
>
long meow(long time) <
// используется один параметр типа long
return time;
>
double meow(double time) <
// используется один параметр типа double
return time;
>
>

Смело берите какой угодно метод из класса:

Cat kitty = new Cat();
kitty.meow();
kitty.meow(3);
kitty.meow(3, 2);
kitty.meow(4500.25);

Мы без проблем можем увидеть, что за версия вызывается в этих случаях.

Методы Java: как их вызывать и использовать

Алгоритм вызова

Если нам надо, чтобы метод вызывался из любого необходимого класса или из внешнего файла, мы используем модификатор public. Модификатор private — только внутри своего класса.

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

public static void main(String args[]) <
System.out.print(maxFinder(3,8));
>

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

А сейчас давайте рассмотрим пример с методом, который не должен что-либо возвращать. Мы берем метод theWarning(). Сразу подчеркнем, что данному методу не нужны помощники. Он выполняет свою задачу и передает управление коду, находящемуся дальше.

public static void main(String args[]) <
theWarning();
System.out.print(“theWarning завершил свою работу. Идём дальшe.”);
>

Методы Java: как их вызывать и использовать

Абстрактные методы

Что такое абстрактный метод? Этот тот, объявление которого состоялось без реализации. Он как привидение — без своего тела. У него даже нет своих фигурных скобок. В этом случае, нам придется воспользоваться модификатором abstract — поставить его перед именем метода.

abstract void methodName();

Абстрактные методы можно объявлять только в абстрактном классе. По сути своей, это шаблон.

Узнавайте и учитесь новому, улучшайте уже имеющиеся знания на курсах в IT-колледже DevEducation. Доступна запись на многие направления и для разных уровней знаний.

Как вызывать методы в Java из другого класса

Давайте пофантазируем. Допустим, произошло какое-то событие, и maxFinder перестал быть статическим и теперь находится в отдельном классе. Как в этом случае действовать? План таков: сначала мы создаем объект класса, в котором гипотетически находится maxFinder. Для простоты давайте думать, что он расположен в классе SampleClass. Вот как происходит вызов в этом случае:

public void main(String args[]) <
SampleClass sc= new SampleClass();
System.out.print(sc.maxFinder(5,8));
>

В случае, если наш метод статический, вызов происходит через точку и от имени класса:

Вызывать методы из других классов несложно, особенно научиться применять это для написания лучших эффективных приложений. Этому вас научат на курсах в признанном международном IT-колледже DevEducation.

10 задачек, которые дают на собеседованиях в IT-компании10 задачек, которые дают на собеседованиях в IT-компании
8 главных качеств программиста: что говорят работодатели8 главных качеств программиста: что говорят работодатели
Frontend разработчик: главные навыкиFrontend разработчик: главные навыки

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Ссылки на методы в Java 8

Введение Самым сладким синтаксическим сахаром [https://en.wikipedia.org/wiki/Syntactic_sugar], добавленным в Java до сих пор, безусловно, являются лямбда-выражения [/ lambda-expressions-in-java]. Java — многословный язык, который может мешать производительности и удобочитаемости. Сокращение шаблонного и повторяющегося кода всегда было популярной задачей среди разработчиков Java, и обычно требуется чистый, читаемый, краткий код. Лямбда-выражения устранили необходимость набирать громоздкую шаблонную cod

Время чтения: 7 мин.

Вступление

Самым сладким синтаксическим сахаром, добавленным в Java до сих пор, безусловно, являются лямбда-выражения .

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

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

Эти выражения широко используются в Java Streams API и в среде Spring WebFlux для создания реактивных динамических приложений.

Еще одна, действительно полезная функция, добавленная в Java 8, — это ссылки на методы , которые делают лямбда-выражения намного более краткими и простыми, вызывая (ссылаясь) на методы с использованием имени метода, когда лямбда-выражение использовалось бы просто для вызова метод.

Ссылки на методы

Ссылки на методы — это, по сути, сокращенные лямбда-выражения, используемые для вызова методов.

Они состоят из двух частей:

И типичным примером может быть распечатка результатов, скажем, подписки на службу издателя или Java Stream:

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

Мы сделаем простой класс:

Если мы создали этот класс в коллекции, такие как ArrayList , мы не могли сортировать его с помощью утилиты метод .sort() , так как он не реализует Comparable интерфейс.

Что мы можем сделать, так это определить new Comparator для этих объектов при вызове .sort() :

Запуск этого кода даст:

Здесь анонимный класс ( Comparator ) определяет критерии сравнения. Мы можем сделать его намного проще и короче, используя лямбда-выражение:

Выполнение этого фрагмента кода даст:

Опять же, поскольку все, что мы делаем с этим лямбда-выражением, — это вызов одного метода, мы можем ссылаться только на этот метод:

И это также даст:

Типы ссылок на методы

Ссылки на методы можно использовать в нескольких различных сценариях:

  • Статические методы: Class::staticMethodName
  • Методы экземпляра конкретных объектов: object::instanceMethodName
  • Методы экземпляра объектов арбитража: Class::methodName
  • Справочник конструктора: Class::new

Давайте рассмотрим все эти типы на нескольких простых примерах.

Ссылки на статические методы

Вы можете ссылаться на любой static метод класса, просто вызывая содержащий его класс с именем метода.

Давайте определим класс static методом, а затем будем ссылаться на него из другого класса:

А теперь из другого класса воспользуемся static служебным методом:

Выполнение этого фрагмента кода даст:

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

Методы экземпляров отдельных объектов

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

Чаще всего это иллюстрируется настраиваемым компаратором. Мы будем использовать тот же Employee и тот же список, чтобы выделить разницу между этими двумя:

Теперь давайте определим CustomComparator :

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

Запуск этого кода также даст:

Основное отличие состоит в том, что, добавляя еще один уровень через CustomComparator , мы можем добавить больше функций для сравнения и убрать их из самого класса. Такой класс, как Employee не должен быть отягощен сложной логикой сравнения, и это приводит к более чистому и удобочитаемому коду.

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

Методы экземпляров произвольных объектов

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

Хотя, на всякий случай, поскольку этот подход используется очень часто, давайте рассмотрим другой пример:

Выполнение этого фрагмента кода даст:

Может показаться, что это то же самое, что и вызов статического метода, но это не так. Это эквивалентно вызову лямбда-выражения:

Здесь различие более очевидно. Если бы мы вызывали static метод, это выглядело бы так:

Ссылка на конструкторы

Вы можете ссылаться на конструктор класса так же, как и на static метод.

Вы можете использовать ссылку на конструктор вместо создания экземпляра классического класса:

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

Из-за потока имен, если присутствует конструктор Employee(String name) , он будет использоваться.

Другой способ использования ссылок на конструкторы — это когда вы хотите отобразить поток в массив, сохранив при этом конкретный тип. Если бы вы просто сопоставили его, а затем вызывали toArray() , вы бы получили массив Object s вместо вашего конкретного типа.

Если мы попробовали, скажем:

Конечно, мы столкнемся с ошибкой компилятора, поскольку мы .toArray() возвращает массив Object s. Кастинг тоже не поможет:

Но на этот раз это будет исключение времени выполнения — ClassCastException .

Этого можно избежать с помощью:

И с этим мы получаем результат:

Заключение

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *