Как вызвать метод класса java

Внутренние и вложенные классы java. Часть 3

Локальный класс — это вложенный класс, объявленный внутри другого класса и некоторого блока кода этого класса, то есть объявленный между фигурными скобками <>. Этот блок может быть статическим блоком, циклом, телом if и т.д.

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

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

В нашем примере локальный класс «просуществовал» только в области локальной статичной инициализации. Тело «main» не было вызвано. Единственный модификатор, который допускается применять в объявлении локального класса, – это final, предотвращающий, как обычно, возможность расширения класса. Члены локального класса могут быть объявлены как закрытыми, так и открытыми. К ним применяются модификаторы, которые применимы к обычному классу.( java 8)

Еще раз повторим коротко: Локальный класс – это класс, объявленный в блоке Java кода.

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

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

Свойства локального класса:
Подобно вложенным нестатическим классам, локальные классы связаны с окружающим экземпляром и имеют доступ ко всем членам, включая private члены окружающего класса. Локальный класс нельзя объявить с каким-либо модификатором доступа, кроме как static final.

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

Как и нестатические вложенные классы, и по тем же причинам, локальные классы не могут иметь static поля, исключение составляют константы, объявленные как static final.

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

Если класс определяется в теле метода, то его называют локальным внутренним классом. Пример доступа к переменным внешнего класса из локального внутреннего класса:

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

Случаи применения
Анонимные классы применяются там, где вам необходим функционал анонимного класса без повторного использования. При повторном использовании есть смысл создать отдельный класс. Добавить новый функционал анонимному классу вы можете так:

Здесь точка с запятой, в отличии от языка с++ означает не только окончание класса, а окончание блока кода.

Давайте немного более расширим пример:

Но в таком виде наш пример не будет работать. Ведь у анонимного класса нет конструктора, кроме как конструктора базового класса. Как же нам быть? Как запустить наш метод, если у нас нет имени класса, нет конструктора класса, а есть только метод?

У нас есть возможность выполнить наш метод из блока инициализации.
Дописываем блок инициализации и выполняем наш метод:

Напишу еще один учебный пример с пояснениями:

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

Какое применение находят анонимные классы?
В основном для создания «слушателей» какого-то события.
Пример:

Здесь мы добавили к item новый «слушатель» события и далее переопределяем его метод под наши требования. Фактически мы используем анонимный класс new ActionListener() и переопределяем методы родительского класса ActionListener. Если нам понадобится, то мы можем получить имя анонимного класса. Развитие идеи анонимного класса с одним методом получило в виде лямбд в java8. Сама запись new ActionListener(); означает что мы создаем анонимный класс без имени унаследованный от ActionListener. Добавление функциональности нашему классу new ActionListener();

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

Вызов метода анонимного класса:

Анонимный вложенный класс не является членом содержащего его класса. Анонимный класс определяется и порождает экземпляр в момент использования. Он не определяется вместе с остальными членами включающего его класса. Анонимный класс можно поместить в любом месте программы, где разрешается применять локальные переменные.
В зависимости от контекста анонимный класс, член другого класса, ведет себя по-разному.
В нестатическом контексте появляется окружающий его экземпляр, в статическом контексте ведет себя как статический.
Цитата из книги «Effective Java TM. Programming Language Guide. Joshua Bloch». Издательство «Лори»:

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

Реальный пример использования анонимных классов на основе адаптеров:

На этом позвольте закончить. Надеюсь я написал довольно ясно для понимания и кратко.
А также написал и протестировал достаточно ясный код.

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

Майкл Морган. «Java 2. Руководство разработчика» ISBN 5-8459-0046-8
Брюс Эккель. «Философия Java.» ISBN 5-272-00250-4
Герберт Шилдт «Java. Полное руководство. 8-е издание.» ISBN: 978-5-8459-1759-1

Методы в Java

Привет! Это статья про основу основ Java и программирования вообще — про методы. В данной статье мы поэтапно объясним что такое методы в Java и зачем они нужны на конкретном примере. А в конце статьи Вы найдете ссылку на задачи, чтоб закрепить полученные знания на практике &#128521;

Что такое метод?

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

Метод в двух словах

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

слово()

Например — это названия 4 методов:

println()

hasNextInt()

getNumber()

main()

Зачем же они нужны?

Давайте поясним на примере. Представьте, что мы пишем программу-калькулятор.

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

1. Ввести 2 числа

2. Ввести операцию: "+" для сложения, "-" для вычитания, "*" для умножение и "/" для деления

Поэтому мы бы написали следующий код:

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

Что мы тут видим? На самом деле, в каждой строчке выполняется метод:

Все, что подчеркнуто — методы. И да-да, main — это тоже метод! Если записать схематически, то получим:

Что делают все эти методы? Какая логика этого кода?

Давайте объясним это так. Каждый метод отвечает за какое-то действие:

Два типа методов

В коде Вы можете увидеть:

  • методы, которые Вы уже знаете:
  • методы, которые видите впервые — эти методы мы написали сами:

Таким образом, все виды методов в Java можно поделить на две категории:

1. Стандартные, то есть написанные в стандартных библиотеках Java. Просто берешь нужный метод и используешь.

2. Пользовательские, то есть методы, которые Вы сами написали.

Как методы располагаются в программе

Мы уже говорили, что метод — это "строительный блок" программы. Как же они располагаются в программе?

Схематически это можно показать так:

Но выше, когда мы показывали код программы калькулятор, у нас был только один метод — main(). Как мы писали, это была только часть кода. Давайте теперь покажем весь — только не пугайтесь &#128578;

Много? Давайте представим этот код схематически:

А теперь на пару секунд отойдем от нашего примера и посмотрим, как строится каждый конкретный метод.

Как же строится метод?

Давайте посмотрим на самый простой метод:

Тааак, что мы тут имеем? Если присмотреться, мы видим знакомые слова — int, метод println(). Из незнакомого только слово void, с ним мы разберемся чуть позже:

Отлично! Половина есть &#128578; Так что же все это значит?

Как Вы могли догадаться, myMethod — это название метода.

Название метода должно быть уникальным. Если название состоит из нескольких слов, напишите его, используя CamelCase (что такое "CamelCase" можно прочитать в данной статье).

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

Таким образом для того, чтобы метод выполнился, ему нужно в скобочках записать число (в терминологии методов это называется "передать значение в метод") типа int. Таким образом оно автоматически подставится в переменную х и будет доступно внутри метода. Кстати, то, что метод принимает, в данном случае int x, называется параметром метода.

То, что записано перед названием метода, то есть перед myMethod , это то, что метод возвращает.

Что значит возвращает? "Возвращает" — это значит, что после того, как метод выполнился, мы можем получить определенное число, строчку или другое значение, которое нужно использовать в том месте, где метод вызван.

Таким образом, как видите, перед значением, которое нужно вернуть, пишется специальное слово return. Обратите внимание, что значение, которое возвращает метод, должно быть того же типа, который записан перед названием метода. В нашем случае double. Собственно говоря, поэтому мы считываем с консоли именно nextDouble().

А что же такое за слово void, которое записано в предыдущем примере перед названием метода? Перед названием метода записывается слово void (с англ. "пустота"), если метод не должен ничего возвращать. То есть метод выполнил код, а в место, где он вызван, он ничего не возвращает. Примером такого метода может быть метод println(), который мы используем в System.out.println(). Все, что нужно от метода, — это вывести в консоль значение. И все. Мы же ничему не присваиваем System.out.println() ? Нет. Таким образом можно отличать методы, которые что-то возвращают и "войдовские" методы:

  • если вызов метода мы чему-то присваиваем — метод возвращает определенное значение
  • если же просто вызываем метод в отдельной строчке — этот метод "войдовский"

Ок, это уяснили. Вернемся к нашему простому примеру.

То есть я — метод с названием myMethod(). Я принимаю на вход какое-то число x, которое обязательно должно быть integer.

Принимать метод может и несколько переменных или другими словами параметров, но возвращать — только одну:

Если Вы хотите передать несколько параметров методу — пишите их через запятую:

Как видите, мы передали методу myMethod() 3 параметра:

  • int x — то есть какое-то число x, которое обязательно должно быть integer
  • String s — какую-то строку (слово или фразу)
  • long l — какое-то число l, которое должно быть long типа

Помимо параметров, есть еще такое понятие как "тело метода". С этим все просто: все, что написано в фигурных скобках <> — это тело метода. То есть это код, который должен выполнять метод. В данном примере в теле метода только 1 строчка кода:

  • System.out.println("You enterеd number " + x);

А значит метод myMehod() всего-навсего выводит в консоль введенное пользователем число.

На практике

Теперь давайте вернемся к нашему примеру — к огромному устрашающему куску кода, который мы показали чуть выше в этой статье &#128578; Сейчас мы с Вами разберем по частям из чего состоит этот "устрашающий код" и тогда он покажется совсем не страшным.

Что делает каждый метод?

Начнем с метода main(), который задает общую логику нашей программы:

Модуль 3. Урок 1. Основы использования и создания методов в классах. — Введение в Java

alt textОбъявление метода

Логично, что для появления такого члена класса как метод — его нужно объявить.

Метод не является объектом в java сам по себе. Он всегда привязан к конкретному классу или объекту этого класса.

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

Метод не может быть объявлен:

  • внутри другого метода;
  • отдельного блока кода в пределах класса;
  • за пределами класса;
  • внутри условных операторов, циклов и пр.

Исключение составляют анонимные классы. Но об этом будет отдельный урок.

Объявление метода состоит из:

  • модификатора доступа (private, package-private aka default, protected, public);
  • модификатора уровня (static or not);
  • возвращаемого типа;
  • идентификатора этого метода (имя, по которому к нему можно будет обратиться);
  • аргументов в круглых скобках, которые пишутся сразу за идентификатором, без пробелов ( methodName(int a, int b) );
  • фигурных скобок, в которые заключено тело метода.

Что означают все эти слова в объявлении метода?

Разберем этот вопрос на примере метода, с которого начинается каждая программа:

public — это модификатор доступа (видимости). Конкретно public говорит, что этот метод доступен любому внешнему классу или программе.

Более детально о модификаторах доступа расскажем в пятом модуле.

static — это модификатор, отвечающий за уровень метода. Если есть такой модификатор — метод находится на уровне класса, а не объекта. Если нет модификатора static — метод уровня объекта!

Детально эта тема будет рассмотрена буквально через урок.

void — конкретно это ключевое слово говорит, что метод ничего не возвращает. На его месте может быть любой тип из мира java — такой тип и должен возвращать метод.

Что может возвращать метод:

  • any type (любой тип) и даже null . Не важно что это, примитив или ссылочный тип. Но обязательно должно быть ключевое слово return в теле метода.
  • void —> Просто ничего не возвращать. Даже null . Ключевое слово return не требуется, но может быть применено для преждевременного завершения работы метода, по задумке программиста.

main — это идентификатор, имя метода. Конкретно в случае с main -методом — это не просто имя, а метод с которого начинает выполняться вся программа.

  • имя метода:
  • пишется в camelStyle — каждое слово в имени метода пишем с большой буквы, кроме самого первого слова;
  • имя метода должно быть говорящим, как и у переменных. Только в случае с методом — имя должно быть глаголом!

(String[] args) — в круглых скобках перечислены аргументы данного метода. Их может и не быть вовсе в каком-то методе, а в каком-то и десяток набежать.

. // некий код в теле метода — это непосредственно тело метода, находящееся между фигурных скобок: <> . Именно внутри этих фигурных скобок и нужно писать логику которая, используя аргументы и поля класса, будет что-то вычислять.

Как вызвать метод?

Разберем на примере следующего класса:

Для начала создадим объект и ссылку на него: Car car = new Car(); // именно car с маленькой буквы, в данном примере, является ссылкой

Создавать этот объект необходимо в месте, где мы будем его использовать. Пускай это будет main -метод.

Если метод не статический, то для обращения к нему нужно:

  • иметь ссылку на инстанс —> car
  • использовать точку —> car.
  • указать имя метода после точки —> car.startEngine
  • передать аргументы, если они ожидаются —> car.setSpeed(12); или не передать, если не ожидаются —> car.setSpeed();

Вот так это выглядит в коде:

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

  • car.startEngine(); // вызов через объект
  • Car.startEngine(); // вызов через имя класса

Детальнее об этом в уроке про уровни методов.

ключевое слово this

Это ссылка на текущий объект(инстанс). Рассмотрим на примере:

Не стесняйтесь копировать и экспериментировать с кодом локально у себя! И используйте вот этот визуализатор. Он показывает результаты работы отдельных выражений в коде.

Немного модифицированный пример из видео

На наш взгляд этот пример помогает уловить суть происходящего в коде на уроке. Не стесняйтесь тестировать и играться с этим кодом самостоятельно:

Как читать UML-диаграммы (методы)

С индикаторами модификаторов доступа Вы уже должны быть знакомы:

Имена полей и их типы в диаграммах пишутся через двоеточие, например: countr: int , name: String . Но в коде, не забывайте, сначала пишем тип, а потом имя.

С методами почти тот же подход, только слов больше.

Например, если в диаграмме написано:

  • + getAge(): int — этот метод public , имеет имя getAge и возвращает объект типа int .
  • — computeSomething(data1: Data, data2: Data): String — этот метод private , имеет имя computeSomething , возвращает объект типа String , на вход принимает два аргумента с именами data1 и data2 , оба типа Data .
  • + setName(newName: String): void — это публичный метод с именем setName , ничего не возвращает (void — пустота), принимает на вход аргумент с именем newName типа String .

Полезные ссылки

    . И всегда можно нагуглить подходящий редактор именно для Вас.

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

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

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