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

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

  • автор:

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

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

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

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

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

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

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

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

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

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

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

Получи грант, покрывающий 50% стоимости обучения
И обучайся новой профессии онлайн из любой точки мира
Получить грант

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

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

Вот элементарный пример, где задача метода — обнаружить среди пары чисел большее. Для примера был использован тип 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: как их вызывать и использовать

87% наших выпускников уже работают в IT
Оставь заявку, и мы поможем с выбором новой профессии
Оставить заявку

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

Если нам надо, чтобы метод вызывался из любого необходимого класса или из внешнего файла, мы используем модификатор 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.

Начни обучение сегодня
FrontEnd разработчик

Профессия Frontend-разработчик — лидер по количеству запросов от работодателей. Без этого специалиста не может обойтись ни одна современная компания, у которой есть сайт. Хотите стать Frontend-разработчиком и создавать сайты, интернет-магазины, маркетплейсы и прочее? Записывайтесь на наш курс!

QA Automation Engineer

QA Automation Engineer — это специалист, который обеспечивает качество продукта и контролирует все этапы разработки с момента появления идеи до релиза. Он имеет компетенции и тестировщика, и разработчика. Он участвует во всех процессах разработки: от подготовки стандартов и требований до самой разработки продукта. А также владеет ручным тестированием и пишет скрипты для автоматизации этого процесса, докладывает о проблемах и контролирует их исправление.

Project Manager

Project Manager — специалист, без которого не может обойтись ни один IT-проект. Если вы хотите войти в сферу IT-технологий, но учить языки программирования это не для вас, тогда профессия Project Manager — то, что вам нужно! Запишитесь на курс Project Management и начните свой путь в IT!

Популярное

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

8 главных качеств программиста: что говорят работодатели

Frontend разработчик: главные навыки

Вызов метода с другого класса

Вопрос: Как вызвать Menu в WindowApp что бы в этом диалоговом окне была вкладка Menu, или я намутил что-то в Menu классе, просто не могу понять как правильно построить структуру классов, с возможностью вызова методов одного в другого.. Спасибо за помощь!

Отслеживать
задан 3 дек 2020 в 23:34
user416946 user416946
9 1 1 серебряный знак 9 9 бронзовых знаков
Где происходит вызов метода?
4 дек 2020 в 8:32
В том то и дело, я не могу понять где правильно вызвать метод с класса Menu.
4 дек 2020 в 11:11
Что значит правильно или неправильно. Надо писать конкретно.
4 дек 2020 в 20:50

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

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

Поэтому пример правится по шагам:

  • статический jFrame убирается, вместо него будет использоваться this , передаваемый в конструкторы
  • Menu не наследуется от MainWindow (меню же НЕ является окном)
  • но в меню нужен доступ до окна ( JFrame ), поэтому пусть оно будет полем в Menu
  • для инициализации поля с JFrame в Menu нужен конструктор
  • и добавить вызов addMenu у созданного объекта.

Итого получается такой набросок из исходного кода:

public class WindowApp extends JFrame < private String title = "AdventureTime The Game"; private Menu menu = new Menu(this); WindowApp() < setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(550, 380); setLocationRelativeTo(null); setResizable(false); setTitle(title); menu.addMenu(); >> public class Menu < JMenuBar jMenuBar = new JMenuBar(); JMenu file = new JMenu("File"); JFrame jFrame; public Menu(JFrame jFrame) < this.jFrame = jFrame; >void addMenu() < jMenuBar.add(file); jFrame.setJMenuBar(jMenuBar); jFrame.revalidate(); >> 

Это только рабочий набросок. Но для развития подойдёт. Например, revalidate здесь не нужен, меню нужно развить, добавив пункты, setVisible обычно лучше делать после выставления всех параметров окна и т.д. и т.п.

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

Есть два класса, в одном из которых есть метод мэйн, в другом классе тоже есть методы. Как мне из класса. где есть метод мэйн вызвать методы другого класса?

  • Вопрос задан более трёх лет назад
  • 44472 просмотра

Комментировать
Решения вопроса 0
Ответы на вопрос 5
Михаил @cocain1988

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

class Apple < public String color; public String color()< return color>> class Shop < public static void main(String[] args)< Apple a = new Apple(); System.out.println( a.color() ); // Данный метод должен вывести цвет. >>

А более подробно лучше конечно прочитать документацию по тем ссылкам которые указывались ранее.

Ответ написан более трёх лет назад
Нравится 5 1 комментарий
Спасибо, хоть один добрый человек объяснил для чайников
software engineer
Пройди туториал чтоли?
docs.oracle.com/javase/tutorial
Ответ написан более трёх лет назад
Нравится 3 1 комментарий
olololosh @olololosh Автор вопроса
спасибо, сам вспомнил, а то посреди ночи голова уже не варит, не подумав, сразу вопросы задаю
localghost @localghost

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

Как вызвать метод класса из другого класса при недостатке информации через аннотации в Java

Что делать, если нужно вызвать метод объекта, о котором мы почти ничего не знаем: ни название, ни его методы (на самом деле знаем, но об этом ниже).

Постановка задачи

Есть некоторый класс какой-нибудь библиотеки, который мы сейчас проектируем, LibraryClass с методом doIt , который принимает произвольный объект:

class LibraryClass  void doIt(Object object)  > > 

Мы знаем, что у принимаемого объекта возможно есть какой-то нужный нам метод, который возвращает строку String . Имя метода мы не знаем.

Точнее мы не знаем это на этапе разработки нашей библиотеки. А на этапе разработки передаваемого класса мы это знать будем.

Нам нужно вызывать этот метод, вытащить оттуда возвращаемую строчку и вывести на экран:

class LibraryClass  void doIt(Object object)  String s = ""; // Вызвать как-то метод и закинуть значение в s System.out.println(s); > > 

Варианты неверных решений

Прошу обратить внимание на то, что это решения неверные строго с точки зрения поставленной задачи. Если на практике возникнет подобная (не такая же) задача, то лучше попробовать какое-нибудь из «неверных» решений.

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

abstract class Parent  abstract String method(); > class LibraryClass  void doIt(Parent object)  String s = ""; s = object.method(); System.out.println(s); > > class Child extends Parent  @Override String method()  return "Bla"; > > LibraryClass library = new LibraryClass(); library.doIt(new Child()); 

Или через интерфейс:

interface Parent  String method(); > 
class LibraryClass  void doIt(Parent object)  String s = ""; s = object.method(); System.out.println(s); > > class Child implements Parent  @Override public String method()  return "Bla"; > > LibraryClass library = new LibraryClass(); library.doIt(new Child()); 

Или даже через указание имени метода:

class LibraryClass  void doIt(Object object)  String s = ""; Class classObject = object.getClass(); for (Method method : classObject.getDeclaredMethods())  String nameMethod = method.getName(); if (nameMethod.equals("method"))  try  s = (String) method.invoke(object); > catch (IllegalAccessException e)  e.printStackTrace(); > catch (InvocationTargetException e)  e.printStackTrace(); > > > System.out.println(s); > > class Child  String method()  return "Bla"; > > LibraryClass library = new LibraryClass(); library.doIt(new Child()); 

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

То есть все эти способы не подойдут. Кстати, последний пример содержит много кода, который мы использует в решении с аннотацией.

Идея решения

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

Решение

Создадим аннотацию NeedMethod (имя взято произвольно), которая будет представлять собой метку. Причем аннотация будет являться частью библиотеки:

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NeedMethod  > 

@Target(ElementType.METHOD) — означает, что метка будет действовать на метод.

@Retention(RetentionPolicy.RUNTIME) — означает, что метка будет работать и при выполнении программы. Без этой строчки наш способ работать не будет — можете проверить.

Теперь библиотечный класс пропишем такой:

class LibraryClass  void doIt(Object object)  String s = ""; Class classObject = object.getClass(); for (Method method : classObject.getDeclaredMethods())  NeedMethod annotation = (NeedMethod) method.getAnnotation(NeedMethod.class); if (annotation != null)  try  s = (String) method.invoke(object); > catch (IllegalAccessException e)  e.printStackTrace(); > catch (InvocationTargetException e)  e.printStackTrace(); > > > System.out.println(s); > > 

Java, в отличии от того же C++ (на самом деле что-то можно и в C++, но в ограниченном виде), позволяет узнавать информацию о классе объекта: имя, его методы и так далее. И мы из присылаемого объекта достаем информацию о классе:

Class classObject = object.getClass(); 

Теперь мы можем в цикле пробежаться по всем методам класса (наследуемые методы не учитываются):

for (Method method : classObject.getDeclaredMethods())  > 

Теперь у каждого метода попытаемся вытащить аннотацию и привести её к типу нашей аннотации NeedMethod :

NeedMethod annotation = (NeedMethod) method.getAnnotation(NeedMethod.class); 

Если нужной отметки нет, то annotation будет приравнен к null . Что и используем:

NeedMethod annotation = (NeedMethod) method.getAnnotation(NeedMethod.class); if (annotation != null)  > 

Теперь внутри этого условия переменная method содержит нужный нам метод. И нам нужно его вызвать. Это можно сделать через invoke , указывая кто вызывает этот метод:

s = (String) method.invoke(object); 

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

Так как не факт, что метод нашелся (это мы знаем, но Java не знает), то обрамляем вызов метода в try catch :

Class classObject = object.getClass(); for (Method method : classObject.getDeclaredMethods())  NeedMethod annotation = (NeedMethod) method.getAnnotation(NeedMethod.class); if (annotation != null)  try  s = (String) method.invoke(object); > catch (IllegalAccessException e)  e.printStackTrace(); > catch (InvocationTargetException e)  e.printStackTrace(); > > > 

Использование библиотеки

Класс библиотеки с аннотацией написаны. Теперь можем проверить в деле.

Создадим класс, например, WorkClass :

class WorkClass  String write()  return "text"; > String writeOther()  return "bla"; > > 

Создадим экземпляр нашего класса WorkClass , библиотечного класса LibraryClass и вызовем метод doIt :

WorkClass workObject = new WorkClass(); LibraryClass library = new LibraryClass(); library.doIt(workObject); 

И в консоли ничего не появилось. Что правильно.

Поставим отметку, то есть аннотацию @NeedMethod , около метода write :

package com.example; import java.lang.annotation.*; import java.lang.reflect.*; public class Main  @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NeedMethod  > public static void main(String[] args)  class WorkClass  @NeedMethod String write()  return "text"; > String writeOther()  return "bla"; > > class LibraryClass  void doIt(Object object)  String s = ""; Class classObject = object.getClass(); for (Method method : classObject.getDeclaredMethods())  NeedMethod annotation = (NeedMethod) method.getAnnotation(NeedMethod.class); if (annotation != null)  try  s = (String) method.invoke(object); > catch (IllegalAccessException e)  e.printStackTrace(); > catch (InvocationTargetException e)  e.printStackTrace(); > > > System.out.println(s); > > WorkClass workObject = new WorkClass(); LibraryClass library = new LibraryClass(); library.doIt(workObject); > > 

Вот теперь на экране высветится text :

Результат выполнения программы

Поставим отметку около метода writeOther , и высветится bla :

package com.example; import java.lang.annotation.*; import java.lang.reflect.*; public class Main  @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NeedMethod  > public static void main(String[] args)  class WorkClass  String write()  return "text"; > @NeedMethod String writeOther()  return "bla"; > > class LibraryClass  void doIt(Object object)  String s = ""; Class classObject = object.getClass(); for (Method method : classObject.getDeclaredMethods())  NeedMethod annotation = (NeedMethod) method.getAnnotation(NeedMethod.class); if (annotation != null)  try  s = (String) method.invoke(object); > catch (IllegalAccessException e)  e.printStackTrace(); > catch (InvocationTargetException e)  e.printStackTrace(); > > > System.out.println(s); > > WorkClass workObject = new WorkClass(); LibraryClass library = new LibraryClass(); library.doIt(workObject); > > 

Результат выполнения программы

Дополнение

Усложненный пример. Можно не читать.

В примере ниже я в метку ввел параметр type , который по умолчанию равен 1 . А в библиотечном классе поставил проверку, что нам нужен метод со значением параметра равным 2 (просто для демонстрации). Ввел также второй класс, в котором метку поставил со значением 2 . В итоге, в первом классе метка не сработает, так как значение в метке равно 1 , а во втором классе сработает:

package com.example; import java.lang.annotation.*; import java.lang.reflect.*; public class Main  @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NeedMethod  int type() default 1; > public static void main(String[] args)  class WorkClass  String write()  return "text"; > @NeedMethod String writeOther()  return "bla"; > > class WorkClassTwo  String write()  return "TEXT"; > @NeedMethod (type = 2) String writeOther()  return "BLA"; > > class LibraryClass  void doIt(Object object)  String s = ""; Class classObject = object.getClass(); for (Method method : classObject.getDeclaredMethods())  NeedMethod annotation = (NeedMethod) method.getAnnotation(NeedMethod.class); if ((annotation != null) && (annotation.type() == 2))  try  s = (String) method.invoke(object); > catch (IllegalAccessException e)  e.printStackTrace(); > catch (InvocationTargetException e)  e.printStackTrace(); > > > System.out.println(s); > > WorkClass workObject = new WorkClass(); WorkClassTwo workObjectTwo = new WorkClassTwo(); LibraryClass library = new LibraryClass(); library.doIt(workObject); library.doIt(workObjectTwo); > > 

Результат выполнения программы

Вот и всё, что хотел рассказать.

P.S. Жаль, что нельзя аннотацию прикреплять к методу динамически, а не в коде, как мы делали.

Что делать, если нужно вызвать метод объекта, о котором мы почти ничего не знаем: ни название, ни его методы (на самом деле знаем, но об этом ниже).

Что делать, если нужно вызвать метод объекта, о котором мы почти ничего не знаем: ни название, ни его методы (на самом деле знаем, но об этом ниже).

Harrix

  • GitHub User
  • [email protected]

Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.

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

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