Что такое void в java

Зачем нужен класс Void?

void.class == Void.TYPE вернет true — таким образом, в большинстве случаев (например, если нужно через рефлексию проверить возвращаемый тип метода) можно (и, на мой взгляд, стоит) использовать void.class — яснее и ненароком не перепутаешь с Void.class . Так что использовать его можно, например, в случаях, когда у вас есть обобщенный класс и вы хотите, чтобы метод ничего не возвращал (т.е. чтобы пользователь класса не ожидал ничего особенного оттуда получить):

UPD. Например, если в проекте регулярно используется Callable<t> для выполнения каких-то асинхронных задач и не хочется мешать его со Thread в тех ситуациях, когда результат работы задачи ничего не должен возвращать, можно реализовать Callable<Void> .

Вызов метода

В Java отсутствует возможность передачи параметров по ссылке на примитивный тип. В Java все пара­метры примитивных типов передаются по значению, а это означает, что у метода нет доступа к исходной переменной, использованной в качестве параметра. Заметим, что все объекты передаются по ссылке, можно изменять содержимое того объекта, на который ссыла­ется данная переменная. В главе 12 Вы узнаете, как предать переменные примитивных типов по ссылке (через обрамляющие классы-оболочки).

Скрытие переменных представителей

В языке Java не допускается использование в одной или во вложен­ных областях видимости двух локальных переменных с одинаковыми именами. Интересно отметить, что при этом не запрещается объявлять формальные параметры методов, чьи имена совпадают с именами переменных представителей. Давайте рассмотрим в качестве примера иную версию метода init, в которой формальным пара­метрам даны имена х и у, а для доступа к одноименным переменным текущего объекта используется ссылка this .

this.x = х;

this.у = у > >

public static void main(String args[])

Point p1 = new Point();

Point p2 = new Point();

p1.init(10,20);

p2.init(42,99);

System.out.println("x = " + p1.x + " у = •• + p-l.y);

System.out.printlnC’x = " + p2.x + " у = •• + p2.y);

> >

Конструкторы

Инициализировать все переменные класса всякий раз, когда создается его очередной представитель — довольно утомительное дело даже в том случае, когда в классе имеются функции, подобные методу init. Для этого в Java предусмотрены специальные методы, называемые конструкторами. Конструктор — это метод класса, который инициали­зирует новый объект после его создания. Имя конструктора всегда со­впадает с именем класса, в котором он расположен ( также, как и в C++). У к онструктор ов нет типа возвращаемого результата — никакого, даже void. З аменим метод init из предыду­щего примера конструктором.

this.x = х;

this.у = у;

> >

public static void main(String args[])

Point p = new Point(10,20);

System.out.println("x = " + p.x + " у = " + p.у);

> >

Программисты на Pascal (Delphi) для обозначения к онструктор а используют ключевое слово constructor .

Совмещение методов

Язык Java позволяет создавать несколько методов с одинаковыми именами, но с разными списками параметров. Такая техника называется совмещением методов ( method overloading ). В качестве примера при­ведена версия класса Point, в которой совмещение методов использовано для определения альтернативного конструктора, который инициализиру­ет координаты х и у значениями по умолчанию (-1).

this.x = х;

this.у = у;

>

х = -1;

у = -1;

> >

public static void main(String args[])

Point p = new Point();

System.out.println("x = " + p.x + " у = " + p.y);

> >

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

С:\> java PointCreateAlt

х = -1 у = -1

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

this в конструкторах

Очередной вариант класса Point показывает, как, используя this и со­вмещение методов, можно строить одни конструкторы на основе других.

this.x = х;

this.у = у;

>

this(-1, -1);

> >

В этом примере второй конструктор для завершения инициализации объекта обращается к первому конструктору.

Методы, использующие совмещение имен, не обязательно должны быть конструкторами. В следующем примере в класс Point добавлены два метода distance. Функция distance возвращает расстояние между двумя точками. Одному из совмещенных методов в качестве параметров передаются координаты точки х и у, другому же эта информация пере­дается в виде параметра-объекта Point.

this.x = х;

this. y = y;

>

int dx = this.x — х;

int dy = this.у — у;

return Math.sqrt(dx*dx + dy*dy);

>

return distance(p.x, p.y);

> >

public static void main(String args[])

Point p1 = new Point(0, 0);

Point p2 = new Point(30, 40);

System.out.println("p1 = " + pi.x + ", " + p1.y);

System.out.println("p2 = " + p2.x + ", " + p2.y);

System.out.println("p1.distance(p2) = " + p1.distance(p2));

System.out.println("p1.distance(60, 80) = " + p1.distance(60, 80));

> >

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

С:\> java PointDist

р1 = 0, 0

р2 = 30, 40

р1.distance(p2) = 50.0

p1.distance(60, 80) = 100.0

Наследование

Вторым фундаментальным свойством объектно-ориентированного под­хода является наследование (первый – инкапсуляция) . Классы-потомки имеют возможность не только создавать свои собственные переменные и методы, но и наследовать переменные и методы классов-предков. Классы-потомки принято называть подклассами. Непосредственного предка данного класса называют его суперклассом. В очередном примере показано, как расширить класс Point таким образом, чтобы включить в него третью координату z.

this.x = x;

this.у = у;

this.z = z; >

this(-1,-1,-1);

> >

В этом примере ключевое слово extends используется для того, чтобы сообщить транслятору о намерении создать подкласс класса Point. Как видите, в этом классе не понадобилось объявлять переменные х и у, по­скольку Point3D унаследовал их от своего суперкласса Point.

Вероятно, программисты, знакомые с C++, очевидно ожидают, что сей­час мы начнем обсуждать концепцию множественного наследования. Под множественным наследованием понимается создание класса, имеющего несколько суперклассов. Однако в языке Java ради обеспечения высокой производительности и большей ясности исходного кода множественное наследование реализовано не было. В большинстве случаев, когда требуется множественное наследование, проблему можно решить с помощью имеющегося в Java механизма интерфейсов, описанного в следующей главе .

super

В примере с классом Point3D частично повторялся код, уже имев­шийся в суперклассе. Вспомните, как во втором конструк­торе мы использовали this для вызова первого конструктора того же класса. Аналогичным образом ключевое слово super позволяет обратить­ся непосредственно к конструктору суперкласса ( в Delphi / С++ для этого используется ключевое слово inherited ).

super(x, y); // Здесь мы вызываем конструктор суперкласса this.z=z;

public static void main(String args[])

Point3D p = new Point3D(10, 20, 30);

System.out.println( " x = " + p.x + " y = " + p.y +

" z = " + p.z);

> >

Вот результат работы этой программы:

x = 10 у = 20 z = 30

Замещение методов

Новый подкласс Point3D класса Point наследует реализацию метода distance своего суперкласса ( пример PointDist.java). Проблема заключается в том, что в классе Point уже определена версия метода distance(mt х, int у), которая возвращает обычное расстояние между точ­ками на плоскости. Мы должны заместить ( override ) это определение метода новым, пригодным для случая трехмерного пространства. В сле­дующем примере проиллюстрировано и совмещение (overloading), и за­мещение (overriding) метода distance.

this.x = х;

this.у = у;

>

int dx = this.x — х;

int dy = this.у — у:

return Math,sqrt(dx*dx + dy*dy);

>

return distance(p.х, p.y);

>

>

super(x, y);

this.z = z;

(

double distance(int х, int y, int z)

int dx = this.x — х;

int dy = this.y — y;

int dz = this.z — z;

return Math.sqrt(dx*dx + dy*dy + dz*dz);

>

return distance(other.х, other.y, other.z);

>

double dx = (this.x / z) — х;

double dy = (this.у / z) — y;

return Math.sqrt(dx*dx + dy*dy);

>

>

public static void main(String args[])

Point3D p1 = new Point3D(30, 40, 10);

Point3D p2 = new Point3D(0, 0, 0);

Point p = new Point(4, 6);

System.out.println("p1 = " + p1.x + ", " + p1.y + ", " + p1.z);

System.out.println("p2 = " + p2.x + ", " + p2.y + ", " + p2.z);

System.out.println("p = " + p.x + ", " + p.y);

System.out.println("p1.distance(p2) = " + p1.distance(p2));

System.out.println("p1.distance(4, 6) = " + p1.distance(4, 6));

System.out.println("p1.distance(p) = " + p1.distance(p));

> >

Ниже приводится результат работы этой программы:

С:\> Java Point3DDist

p1 = 30, 40, 10

р2 = 0, 0, 0

р = 4, 6

p1.distance(p2) = 50.9902

p1.distance(4, 6) = 2.23607

p1.distance(p) = 2.23607

Обратите внимание — мы получили ожидаемое расстояние между трехмерными точками и между парой двумерных точек. В примере используется механизм , который называется динамическим назначением методов ( dynamic method dispatch ).

Динамическое назначение методов

Давайте в качестве примера рассмотрим два класса, у которых имеют простое родство подкласс / суперкласс, причем единственный метод суперкласса замещен в подклассе.

System.out.println("Inside A’s callrne method");

System.out.println("Inside B’s callme method");

> >

public static void main(String args[])

A a = new B();

a.callme();

> >

Обратите внимание — внутри метода main мы объявили переменную а класса А, а проинициализировали ее ссылкой на объект класса В. В следующей строке мы вызвали метод callme. При этом транслятор про­верил наличие метода callme у класса А, а исполняющая система, уви­дев, что на самом деле в переменной хранится представитель класса В, вызвала не метод класса А, а callme класса В. Ниже приведен результат работы этой программы:

Inside B’s calime method

Программистам Delphi / C++ следует отметить, что все Java по умолчанию являются виртуальны ми функци ям и ( ключевое слово virtual ).

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

Все методы и переменные объектов могут быть замещены по умолча­нию. Если же вы хотите объявить, что подклассы не имеют права за­мещать какие-либо переменные и методы вашего класса, вам нужно объ­явить их как final (в Delphi / C++ не писать слово virtual ).

final int FILE_NEW = 1;

По общепринятому соглашению при выборе имен переменных типа final — используются только символы верхнего регистра (т.е. используются как аналог препроцерных констант C++ ) . Использование final-методов порой приводит к выигрышу в скорости выполнения кода — поскольку они не могут быть замещены, транслятору ничто не мешает заменять их вызовы встроенным (in-line) кодом (байт-код копируется непосредственно в код вызывающего метода ).

finalize

В Java существует возможность объявлять методы с именем finalize . Методы finalize аналогичны деструкторам в C++ ( ключевой знак

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

static

Иногда требуется создать метод, который можно было бы использо­вать вне контекста какого-либо объекта его класса. Так же, как в случае main, все, что требуется для создания такого метода — указать при его объ­явлении модификатор типа static . Статические методы могут непосред­ственно обращаться только к другим статическим методам, в них ни в каком виде не допускается использование ссылок this и super. Перемен­ные также могут иметь тип static, они подобны глобальным перемен­ным, то есть доступны из любого места кода. Внутри статических методов недопустимы ссылки на переменные представителей. Ниже приведен пример класса, у которого есть статические переменные, статический метод и статический блок инициализации.

static int a = 3;

static int b;

System.out.println("x = " + x);

System.out.println("a = " + a);

System.out.println("b = " + b);

>

System.out.println("static block initialized");

b = a * 4;

>

public static void main(String args[])

method(42);

> >

Ниже приведен результат запуска этой программы.

С:\> java Static static block initialized

Х = 42

А = 3

B = 12

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

static int a = 42;

static int b = 99;

System.out.println("a = " + a);

> >

public static void main(String args[])

StaticClass.callme();

System.out.println("b = " + StaticClass.b);

> >

А вот и результат запуска этой программы:

С:\> Java StaticByName

а = 42 b = 99

abstract

Бывают ситуации, когда нужно определить класс, в котором задана структура какой-либо абстракции, но полная реализация всех методов от­сутствует. В таких случаях вы можете с помощью модификатора типа ab­stract объявить, что некоторые из методов обязательно должны быть заме­щены в подклассах. Любой класс, содержащий методы abstract, также должен быть объявлен, как abstract. Поскольку у таких классов отсутствует полная реализация, их представи­телей нельзя создавать с помощью оператора new. Кроме того, нельзя объ­являть абстрактными конструкторы и статические методы. Любой под­класс абстрактного класса либо обязан предоставить реализацию всех абстрактных методов своего суперкласса, либо сам должен быть объявлен абстрактным.

abstract void callme();

System.out.println("Inside A’s metoo method");

> >

System.out.println("Inside B’s callme method");

> >

public static void main(String args[])

A a = new B():

a.callme():

a.metoo():

> >

В нашем примере для вызова реализованного в под­классе класса А метода callme и реализованного в классе А метода metoo используется динамическое назначение методов, которое мы обсуждали раньше.

Inside B’s callrne method Inside A’s metoo method

Классическое заключение

В этой главе вы научились создавать классы, конструкторы и методы. Вы осознали разницу между совмещением (overloading) и замещением (overriding) методов. Специальные переменные this и super помогут вам сослаться на текущий объект и на его суперкласс. В ходе эволюции языка Java стало ясно, что в язык нужно ввести еще несколько организационных механизмов — возможности более динамич­ного назначения методов и возможности более тонкого управления про­странством имен класса и уровнями доступа к переменным и методам объектов. Оба этих механизма — интерфейсы и пакеты, описаны в сле­дующей гла ве .

Методы в Java

Методы в Java - 1В Java приложение состоит из классов. Классы, в свою очередь, состоят из переменных. Они отвечают за хранение данных и методов, которые отвечают за поведение класса: иначе говоря, логику, которую он может предоставлять (например, обработку некоторых данных, вызов других методов, и т. д.). Говорить о таких составляющих как переменные можно долго, но мы сегодня не для этого собрались. Давайте лучше поговорим о такой составляющей класса как метод. Методы в Java - 2Метод — это именованный блок кода, объявляемый внутри класса. Он содержит некоторую законченную последовательность действий (инструкций), направленных на решение отдельной задачи, который можно многократно использовать. Иными словами, метод — это некоторая функция: что-то, что умеет делать ваш класс. В других языках тоже присутствуют функции. Только в Java они являются членами классов и, согласно терминологии ООП, называются методами. Но прежде чем продолжить, давайте рассмотрим небольшой пример: Тут ничего сложного: метод Java, задача которого сформировать строку приветствия, с именем, которое мы ему передаем. Как например — Hello world! My name is Bobby Давайте как следует разберемся с построением метода, рассмотрев каждое ключевое слово в объявлении метода (слева направо). Наше первое ключевое слово — public , и оно обозначает модификатор доступа:

Модификаторы доступа

public : публичный. Методы или поля с этим модификатором общедоступны, видимы другим классам (а точнее, их методам и полям) из текущего пакета и из внешних пакетов. Это самый широкий уровень доступа из известных;

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

Модификатор по умолчанию. Если у поля или метода класса нет модификатора, применяется модификатор по умолчанию. В таком случае поля или методы видны всем классам в текущем пакете (как protected , только с отсутствием видимости при наследовании).

private : антипод модификатора public . Метод или переменная с таким модификатором доступны исключительно в классе, в котором они объявлены.

Возвращаемое значение

Методы с возвращаемым значением

Названия методов

Методы в Java - 4

constructHelloSentence — название метода, отличительная особенность, по которой мы сможем отличать тот или иной метод. И, соответственно, вызывать тот или иной метод. Названия методов должны начинаться с маленькой буквы, но и использовать верблюжий стиль (CamelCase, верблюжий регистр): т.е. каждое следующее слово в названии стоит впритык к предыдущему и пишется с большой буквы. Наименования методов должны описывать метод (лучший комментарий — правильное именование). Для этого используйте глаголы или сочетания с глаголами: getCat , delete , createCar , и так далее. В пределах одного класса имена методов должны быть уникальными (не считая перегрузки методов, о чем поговорим немного ниже). Смотрим дальше разбираемый нами метод и видим ( String name )

Параметры метода

Вызов методов

Методы в Java - 5

Итак, с созданием методов разобрались, теперь давайте поговорим об их использовании. Как вызвать метод в Java? Каждый метод в Java находится в классе. Чтобы разобраться, как устроен вызов методов в Java, возьмем класс: Так как у нас метод не является статическим (это отдельная тема для разговора, выходящая за рамки сегодняшней статьи), для его вызова нужно сперва создать объект, и уже у него вызвать метод: В аргументы нашего метода мы передали строку (имя), которую хотим видеть в результирующей строке, выведенной на экран: Также стоит напомнить, что методы можно переиспользовать то количество раз, сколько нам потребуется — ограничений нет.

Методы в Java - 6

Часто в коде можно увидеть ключевое слово this , как например в сеттерах: И что же оно значит? this в Java — это ссылка на текущий объект данного класса. Например, если мы создали объект: то this внутри объекта stringConstructor будет ссылкой на этот же объект. this используется как для ссылки на переменную объекта (как в сеттере выше), так и для вызова некоторого метода. Мы можем немного переписать наш класс: Через this мы вызываем метод данного объекта, для взятия необходимой строки. Но всё же как правило для методов this почти не используется, так как и без него идёт ссылка на метод данного объекта, в основном он используется для на переменную объекта.

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

Методы в Java - 7

Предположим нам понадобился метод, выполняющий по сути ту же самую логику, но в предложении Hello world ! вместо world мы хотим вставить своё слово (строку). Но ведь у нас уже есть метод constructHelloSentence . Значит, нам нужно придумать новое название для метода, который выполняет по сути тот же функционал? Как бы не так: в этот момент на помощь нам приходит перегрузка методов. Перегрузка методов — это использование одного и того же имени метода несколько раз при его объявлении в классе. С точки зрения синтаксиса языка, не может быть двух одинаковых имен в некотором локальном пространстве. Но при этом допускается объявление методов с одинаковыми именами но отличающимися аргументами. Иными словами, класс содержит в себе перегруженные, когда есть два и более методов с одинаковыми названиями, но различными входными данными: Здесь мы видим, что методы не обязаны содержать одинаковый модификатор доступа (как и возвращаемый тип). Если вызывается перегруженный метод, то из нескольких объявленных методов компилятор автоматически определяет нужный по параметрам, которые указываются при вызове.

Что такое Void?

Что такое void в методе?
что в данном случае делает метод void и как он работает? http://priscree.ru/img/397d9fa96dcc5b.jpg

Что такое монитор и что такое мьютекс? Это же разные вещи?
Здравствуйте. В разных айти-статьях по-разному используют эти термины, причём часто их путают друг.

Что такое void?
Что такое void?

Что такое void?
С++ 1).Что такое void ? 2).Что ткое void swap ? 3).Что такое temp ? 4).Что ткое fot ? .

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

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