что расположено в круглых скобках в следующем коде public void print string s int count
Добавление статических переменных и реализация статических методов
Столкнулся с проблемой. 1)Добавьте две статические переменные для хранения общей стоимости и общего количества всех товаров во всех корзинах. 2)Реализуйте статические методы, которые будут увеличивать значения этих переменных при добавлении в корзину новых товаров. Переменные basketCount и totalCost добавил, количество корзин в консоль выводит. А вот с общей стоимостью товаров проблема. Пробовал static поставить для totalPrice, после этого в консоль выводится общая стоимость, но с каждой корзиной она увеличивается, и для каждой корзины выдает стоимость больше, чем есть товаров в ней(то есть totalPrice(1-й корзины) + totalPrice(2-й корзины и т.д.). А мне необходимо, чтобы общую стоимость товаров для каждой корзины не менялось, и выводило общую стоимость всех товаров во всех корзинах. Рад любой помощи.
И тестовый класс Main:
1 ответ 1
Очень плохие названия переменных. В английском языке не хватает слов.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками java static или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.21.40537
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Создание класса в java
Создавать класс мы будем в программе Ecllipse, но также можно работать в любой другой IDE или в блокноте. В качестве примера мы будем создавать класс, который описывает характеристики и поведение кота.
В итоге, у нас создался новый класс (рис 5.2).
Структура класса в java
Класс в java оформляется с помощью следующей конструкции:
Рассмотрим ее составляющие:
public – модификатор доступа к классу, в данном случае он нам говорит, что этот класс будет доступен не только данному классу, но и другим. В java существуют и другие модификаторы, но об этого поговорим позднее.
class – ключевое слово, говорящее о том, что это класс.
Cat – имя класса. Имена классов принято писать с заглавной буквы.
< >– фигурные скобки, между которыми разместится тело нашего класса.
В предыдущем уроке мы упоминали, что классы в java состоят из атрибутов и методов, присвоим некоторые и нашему коту.
Атрибуты класса Сat
Атрибутами кота могут быть: имя, вес, окраска. Атрибуты это переменные, которые объявляются следующим образом:
private – здесь опять же указывает на права доступа. К переменной, в данном случае, можно обращаться только из ее класса, чтобы классы извне не могли ее изменить (вспомним инкапсуляцию из урока 4).
int, String – это типы данных. В данном случае вес будет задан при помощи целого числа – int, a имя и цвет при помощи символьной строки String.
После объявления каждого атрибута должна ставиться точка с запятой ;
При помощи // в коде программы оформляются комментарии, которые являются правилом хорошего тона.
Методы класса Сat
Пусть наш кот умеет есть, спать и разговаривать. Опишем это поведение с помощью методов.
public void eat() – сигнатура метода, его определение. В данном случае она нам говорит о том, что:
eat – имя метода. Имена методов, в отличие от имен классов, принято писать с маленькой буквы. На конце каждого метода после имени всегда идут круглые скобки ( ), пустые или содержащие параметры (об этом позднее).
После сигнатуры метода идут фигурные скобки < >. В них содержится тело метода. Тело нашего метода содержит просто вывод сообщения о том, что кот кушает — "Eating. \n". За вывод текстового сообщения отвечает метод System.out.print("Eating. \n").
\n — символ перевода строки, чтобы при выводе наших сообщений все они не писались в одну строку.
Аналогично предыдущему методу опишем спящего кота:
И немного иначе опишем метод – кот говорит:
В отличие от предыдущих методов этот метод возвращает значение и имеет входные параметры. Давайте подробнее рассмотрим сигнатуру метода public String speak(String words):
public — метод speak() доступен для других классов;
String — тип значения, которое возвращает метод. В предыдущих случаях ключевое слово void указывало на то, что метод ничего не возвращает. В данном случае String указывает на то, что метод возвращает значение типа строка.
Что же это значит? В процессе своей работы метод выполняет определенные действия над данными. Иногда необходимо, чтобы результат этих действий был передан для дальнейшей обработки другим классам, в этом случае метод передает (возвращает) этот результат. Эти возвращаемые данные относятся к какому-либо типу. В нашем примере это тип символьной строки, String.
Возвращающие методы должны содержать в своем теле ключевое слово return, которое указывает на то, что именно возвращает данный метод. В нашем случае это переменная phrase.
speak — имя метода.
(String words) — входные параметры. Входные параметры — это какие-либо данные, которые передаются из других классов и, которые метод должен обработать. Наш метод получает в качестве входных данных строку в виде переменной words, к этой строке дописывает «. mauu. » и возвращает то, что получилось.
В итоге класс Cat выглядит следующим образом:
Обращение к классу в Java
Далее рассмотрим обращение к классу Cat. И то, как его использовать в работе.
public static void main(String[] args) – сигнатура метода main(). Программа состоит из нескольких классов, но только один из классов может содержать метод main(). Mетод main(), это так называемая точка входа в программу. Без этого метода мы не сможем стартовать программу. Теперь, вместо приветствия миру, этот метод будет содержать код для работы с классом Cat.
Пишем в тело метода main() (между его фигурными скобками) следующие строки:
Разберем подробнее, что это значит.
Прежде чем вызывать созданные нами методы в классе Cat и заставить нашего кота есть, спать и говорить, сперва нужно создать экземпляр класса (инстанцию).
Данная строчка нам говорит о том, что в памяти создан экземпляр объекта Cat, а переменная ourcat типа Cat (такого же, как и наш объект) указывает на то место в памяти, где был этот объект создан.
Переменную ourcat теперь можно использовать для вызова методов класса Cat, например:
При вызове этих методов в программе Eclipse удобно пользоваться комбинацией клавиш
Ctrl + пробел, после введения имени переменной и точки (рис 5.4). Программа подскажет, какие можно использовать методы для данной переменной.
Если метод возвращает какое-либо значение, например, как наш метод speak() возвращает значение типа String, то его можно вызывать следующим образом:
Вспомним, что при описании нашего метода он содержал параметры speak(String words). Теперь, при вызове в качестве параметра выступила фраза "Play with me", метод speak() ее обработал и вернул "Play with me. mauu. ". Именно это значение он присвоил переменной say.
Мы это можем проверить, выведя say на печать при помощи команды:
Итак, наш класс HelloWorld теперь выглядит следующим образом:
Теперь сохраним (Ctrl+Shift+S или ) и запустим (
) нашу программу. При запуске Eclipse может предложить выбрать Java Applet или Java Application. Нужно выбрать Java Application (рис 5.5).
В качестве результата внизу в консоли мы получаем следующие строки.
На этом закончим данный урок, итак, в этом уроке мы:
Для закрепления материала предлагаю самостоятельно создать класс Dog, где описать характеристики и поведение собаки, а потом вызвать этот класс из HelloWorld. Свои вопросы можете оставлять в комментариях.
Комментариев к записи: 115
Добрый день, Мария. Объяснения просто супер четко и понятно, но вопросы все — таки возникли. При создании нового класса создаются файлы, как я понял несколько — один формата JAVA, второй формата CLASS. Верно или я что — то путаю? Если, к примеру существует файл формата CLASS, но без файла с форматом JAVA, существует ли возможность прочесть его код? Можете более подробно описать структуру создаваемых файлов, может быть в отдельной главе.
Спасибо за статью и заранее спасибо за ответ.
Здравствуйте, не могу запустить вашу программу на Netbeans. Программа выдает такой результат:
Error: Could not find or load main class project1.Project1
Java Result: 1
public class HelloWorld <
public static void main(String[] args) <
cat ourcat= new cat();
ourcat.eat();
ourcat.sleep();
String say = ourcat.speak(«Play with me»);
System.out.println(say);
// TODO Auto-generated method stub
>
Посмотрите в первой строчке слово сat получается написать только с маленькой буквы, если написать Сat c большой выскакивает ошибка :Multiple markers at this line как её можно исправить?
А вы когда создавали класс Cat вы его с какой буквы назвали?
Вот поэтому с большой и не получается. В Java имена классов, методов, переменных чуствительны к регистру. Сat и cat это разные имена, и если вы создали класс и назвали cat, то класса Cat не существует. А еще есть соглашение по оформлению кода в Java (Java Code Conventions), согласно которому классы нужно называть только с большой буквы, а переменные и методы с маленькой. Поэтому переименовывайте
Добрый день, подскажите пожалуйста, как работает переменная phase в описанном вами примере в методе //кот разговаривает. Не понятно куда phase возвращается и как задействовано. У меня программа выдает ошибку в этом месте.
Переменная в моем примере называется phrase, может вы ее в разных местах по-разному назвали, из-за этого ошибка? Было бы хорошо, если бы вы указали какая имено ошибка, ато они разные бывают, а я не экстрасенс)
Работает так: в методе main вы вызываете метод speak, как это описано в примере.
String say = ourcat.speak(«Play with me»);
Фраза «Play with me» передается методу speak в переменную words. Затем в методе speak объявляется новая строковая пременная phrase. Этой переменной присваивается значение переменной words («Play with me» ) и плюс строка «…mauu…» Итого в переменной phrase имеем строку «Play with me…mauu…». Эту строку мы возвращаем, тоесть передаем туда, где был вызван метод speak в методе main.
Вызван он был так
String say = ourcat.speak(«Play with me»)
Результатом работы ourcat.speak(«Play with me») является строка «Play with me…mauu…», следовательно переменная String say теперь содержит строку «Play with me…mauu…»
Извините, забыл дописать описание ошибки
Reports unnecessary local variables, which add nothing to the comprehensibility of a method. Variables caught include local variables which are immediately returned, local variables that are immediately assigned to another variable and then not used, and local variables which always have the same value as another local variable or parameter.
Так у вас это ошибка или предупреждение? Ошбика это Error, если в коде есть ошибки, то его нельзя скомпилировать. Предупреждение это Warning, подчеркивается желтым и с ним можно жить и компилироваться. В данном случае джава считает, что переменная используется избыточно, и можно обойтись и без нее. Обойтись можно, но данный пример был приведен для наглядности передачи параметров в метод и возвращения значения.
понятно, я разобрался. Спасибо за ваше терпение.
Здравствуйте.
Не могу понять, где ошибка.
[img]http://u.pikucha.ru/idgcn/2014-06-24+21-26-08+%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82+%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0.png?referrer=http%3A%2F%2Fpikucha.ru%2F[/img]
C уважением, Ирина.
Добрый день, Ирина, у вас скобок не хватает после new Cat: ourcat= new Cat();
Спасибо огромное! Это все моя невнимательность. Вы, кажется, где-то поясняли про эти скобки. но я еще не совсем уяснила, где конкретно их требуется ставить.
Знаешь ли ты JAVA, %username%? Часть вторая
В начале января я написал пост с интересными тестовыми задачками по Java. Он вызвал достаточно большой интерес, интересные задачки еще остались, поэтому продолжим.
Сразу отвечу на некоторые вопросы, ответы на которые могли затеряться в комментах.
Во-первых, спрашивали, что почитать по теме. Очень рекомендую эту книжку. На русском не встречал, но читается она почему-то гораздо легче большинства книг по программированию, так что для большинства это не должно стать проблемой. Во-вторых, спрашивали где взять таких задачек. Тут что-то конкретное не посоветую, задачи из разных источников, в том числе некоторых нефришных наборов тестов, поэтому как вариант можно обратить внимание на источники, ссылки на которые есть в комментах к первой части статьи.
Так получилось, что в данную часть попали более легкие задачи, так что результаты должны быть лучше. Итак, очередной тест под хабракатом (Осторожно, во второй половине ответы и пояснения).
Правильный ответ только один, если не указано обратное.
Вопрос 1
Имеется следующий код:
Вопрос 2
Что мы получим в результате выполнения:
Вопрос 3
Вопрос 4
Имеется следующий код:
Вопрос 5
Имеется следующий код:
Вопрос 6
Что можно сказать о данном коде?
Вопрос 7
Имеется следующий код:
Внимание — Ответы
Пояснения
Вопрос 1
Данный код выведет Tort Tort. Вроде как должен работать полиморфизм, и, как известно, выбор осуществляется по типу объекта, на который ссылается ссылка, а не по типу самой ссылки. Но в джаве есть переопределенные методы. И всё. Переопределенных полей либо конструкторов просто не существует. То есть реализация метода всегда выбирается в зависимости от объекта, на который мы ссылаемся. Поля класса, наоборот, выбираются исходя из типа ссылки, и переопределение тут не работает. Поэтому мы и получаем такой результат.
Вопрос 2
Вопрос 3
Аргументы методов вычисляются слева направо и то, что во втором аргументе мы присваиваем s новое значение уже ничего не меняет, так как первый аргумент уже вычислен. Если вычисление одного из аргументов заканчивается неудачно, все остальные аргументы расчитываться не будут вообще.
Вопрос 4
Метод print() переопределен в классе B. Соответственно, выбор метода осуществляется по типу актуального объекта. Когда создается объект класса B, сначала вызывается конструктор A, который вызывает метод print(). Поскольку мы создаем объект класса B, вызывается версия print() из класса B. В это время переменной i еще не присвоено значение, поэтому выводится значение по умолчанию (0). Ну и в последствии выводится проинициализированное значение i. В результате получаем ответ 0 4.
Вопрос 5
Известно, что при создании объектов класса Thread в конструктор можно передавать Runnable объект, метод run() которого будет выполняться в отдельном потоке. Поэтому ожидаемый ответ — вывод «In Threader». Причина нестандартного поведения — это метод run() в классе Pooler. Переопределив метод run(), мы тем самым потеряли дефолтное поведение класса Thread.
Вопрос 6
Данный код абсолютно работоспособен. То, что в обоих интерфейсах присутствует одинаковый метод m() не создает проблем, так как реализация в любом случае будет одна. Сложнее с полем VALUE. Мы не можем напрямую обращаться к нему, так как возникнет неоднозначность. Но это можно сделать, например, так:
После приведения объекта к одному из интерфейсов, мы получаем доступ к полям, которые ранее не могли использовать.
Вопрос 7
Имеется следующий код:
NullPointerException в данном случае не возникнет, так как любое действие с массивом, в том числе проверка существования объекта происходит только после того, как будет полностью рассчитан индекс элемента.
Ситуация становится интереснее, если мы присваиваем что-либо элементу массива. Например дан код:
Как правило, множественные операции присваивания рассчитываются справа налево. Но индексы — исключение. В данном случае сначала будет вычислен индекс (arr[0]), и только потом переменной i присвоится новое значение.
Спасибо всем за внимание. Вероятно, в данном формате писать больше не буду, планирую переходить к рассмотрению отдельных малоосвещенных в книгах тем.
C # | Запечатанный Класс
Ниже приведен синтаксис запечатанного класса:
Следующее определение класса определяет запечатанный класс в C #:
В следующем коде создайте запечатанный класс SealedClass и используйте его из Program. Если вы запустите этот код, то он будет работать нормально.
// код C # для определения
// Запечатанный класс
sealed class SealedClass <
public int Add( int a, int b)
static void Main( string [] args)
// Создание объекта Sealed Class
SealedClass slc = new SealedClass();
// Выполнение операции сложения
int total = slc.Add(6, 4);
Console.WriteLine( «Total = » + total.ToString());
Выход :
// C # код для отображения ограничений
// Запечатанного Класса
// Создание запечатанного класса
sealed class Test : Bird <
// Наследование запечатанного класса
class Example : Test <
Ошибка:
Error CS0509 ‘Example’ : cannot derive from sealed type ‘Test’
Рассмотрим следующий пример запечатанного метода в производном классе:
// C # программа для
// определить Запечатанный Класс
// Функция отображения для
public virtual void show()
Console.WriteLine( «display dimension : 6*6» );
public virtual void print()
Console.WriteLine( «printer printing. \n» );
class LaserJet : Printer <
// Закрытая функция отображения
// для размерной печати
sealed override public void show()
Console.WriteLine( «display dimension : 12*12» );
// Функция для переопределения
override public void print()
Console.WriteLine( «Laserjet printer printing. \n» );
// Класс Officejet не может переопределить шоу
// функционировать так, как это запечатано в классе LaserJet.
class Officejet : LaserJet <
// не можем переопределить функцию show или иначе
// ошибка компилятора: ‘Officejet.show ()’:
// не может переопределить унаследованный член
// ‘LaserJet.show ()’ потому что он запечатан.
override public void print()
Console.WriteLine( «Officejet printer printing. » );
static void Main( string [] args)
Printer p = new Printer();
Printer ls = new LaserJet();
Printer of = new Officejet();
Выход :
Объяснение: В приведенном выше коде C # класс Printer имеет единицу отображения с размером 6 * 6, а класс LaserJet реализует метод show, переопределяя его для измерения 12 * 12. Если какой-либо класс унаследует класс LaserJet, он будет иметь такое же измерение 12 * 12 и не сможет реализовать свой собственный, т. Е. Он не может иметь 15 * 15, 16 * 16 или любые другие измерения. Таким образом, вызов LaserJet закроет метод show, чтобы предотвратить его дальнейшее переопределение.
Что расположено в круглых скобках в следующем коде public void print string s int count
— Амиго, ты любишь китов?
— Китов? Не, не слышал.
— Этот как корова, только больше и плавает. Кстати, киты произошли от коров. Ну, или имели общего с ними предка. Не столь важно.
1) Переопределение метода.
Представь, что ты для игры написал класс «Корова». В нем есть много полей и методов. Объекты этого класса могут делать разные вещи: идти, есть, спать. Еще коровы звонят в колокольчик, когда ходят. Допустим, ты реализовал в классе все до мелочей.
А тут приходит заказчик проекта и говорит, что хочет выпустить новый уровень игры, где все действия происходят в море, а главным героем будет кит.
Ты начал проектировать класс «Кит» и понял, что он лишь немного отличается от класса «Корова». Логика работы обоих классов очень похожа, и ты решил использовать наследование.
Класс «Корова» идеально подходит на роль класса-родителя, там есть все необходимые переменные и методы. Достаточно только добавить киту возможность плавать. Но есть проблема: у твоего кита есть ноги, рога и колокольчик. Ведь эта функциональность реализована внутри класса «Корова». Что тут можно сделать?
К нам на помощь приходит переопределение (замена) методов. Если мы унаследовали метод, который делает не совсем то, что нужно нам в нашем новом классе, мы можем заменить этот метод на другой.
Как же это делается? В нашем классе-потомке мы объявляем такой же метод, как и метод класса родителя, который хотим изменить. Пишем в нем новый код. И все – как будто старого метода в классе-родителе и не было.
Вот как это работает:
В классе Whale переопределен метод printName();
<
Cow cow = new Cow();
cow. printName ();
>
<
Whale whale = new Whale();
whale. printName ();
>
После наследования класса Cow и переопределения метода printName, класс Whale фактически содержит такие данные и методы:
— Честно говоря, ожидаемо.
2) Но это еще не все.
— Предположим в классе Cow есть метод printAll, который вызывает два других метода, тогда код будет работать так:
Обрати внимание, когда вызываются метод printAll() написанный в классе Cow, у объекта типа Whale, то будет использован метод printName класса Whale, а не Cow.
Главное, не в каком классе написан метод, а какой тип (класс) объекта, у которого этот метод вызван.
— Наследовать и переопределять можно только нестатические методы. Статические методы не наследуются и, следовательно, не переопределяются.
Вот как выглядит класс Whale после применения наследования и переопределения методов:
3) Приведение типов.
Тут есть еще более интересный момент. Т.к. класс при наследовании получает все методы и данные класса родителя, то объект этого класса разрешается сохранять (присваивать) в переменные класса родителя (и родителя родителя, и т.д., вплоть до Object). Пример:
— Очень интересно. А зачем это может понадобиться?
— Это ценное свойство. Позже ты поймешь, что очень, очень ценное.
4) Вызов метода объекта (динамическая диспетчеризация методов).
Вот как это выглядит:
Обрати внимание, что на то, какой именно метод printName вызовется, от класса Cow или Whale, влияет не тип переменной, а тип – объекта, на который она ссылается.
В переменной типа Cow сохранена ссылка на объект типа Whale, и будет вызван метод printName, описанный в классе Whale.
— Это не просто для понимания.
— Да, это не очень очевидно. Запомни главное правило:
Набор методов, которые можно вызвать у переменной, определяется типом переменной. А какой именно метод/какая реализация вызовется, определяется типом/классом объекта, ссылку на который хранит переменная.
— Ты будешь постоянно сталкиваться с этим, так что скоро поймешь и больше никогда не забудешь.
5) Приведение типов.
Для ссылочных типов, т.е. классов, приведение типов работает не так, как для примитивных типов. Хотя у ссылочных типов тоже есть расширение и сужение типа. Пример:
Сужение типа | Описание | |||||
---|---|---|---|---|---|---|
Cow cow = new Whale(); | Классическое сужение типа. Теперь у объекта типа Whale можно вызывать только методы, описанные в классе Cow. 6) А теперь еще на закуску. Вызов оригинального метода. Иногда тебе хочется не заменить унаследованный метод на свой при переопределении метода, а лишь немного дополнить его. В этом случае очень хочется исполнить в новом методе свой код и вызвать этот же метод, но базового класса. И такая возможность в Java есть. Делается это так: super.method().
— Гм. Ничего себе лекция. Мои робо-уши чуть не расплавились. — Да, это не простой материал, он один из самых сложных. Профессор обещал дать ссылок на материалы других авторов, чтобы ты, если все-таки что-то не поймешь, мог устранить этот пробел. 2. Задачи на полиморфизм— Привет, Амиго! Вот тебе пара сотен задач на полиморфизм. — Что? Еще и сотня задач?! — Шучу. Всего десять. То есть пять я хотел сказать. Переопределить метод getName в классе Whale (Кит), чтобы программа выдавала: | |||||
2. Ничего не выводится на экран Переопределить метод getName в классе Whale (Кит), чтобы программа ничего не выдавала на экран. | ||||||
3. Кот от кота, а собака от собаки Переопределить метод getChild в классах Cat (кот) и Dog (собака), чтобы кот порождал кота, а собака – собаку. | ||||||
4. Или «Кошка», или «Собака», или «Птица», или «Лампа» Написать метод, который определяет, объект какого класса ему передали, и выводит на экран одну из надписей: «Кошка», «Собака», «Птица», «Лампа». | ||||||
5. Или «Корова», или «Кит», или «Собака», или «Неизвестное животное» Написать метод, который определяет, объект какого класса ему передали, и возвращает результат – одно значение из: «Корова», «Кит», «Собака», «Неизвестное животное». |
3. Перегрузка методов
— Привет, Амиго! А я расскажу тебе о перегрузке методов.
— Их еще и перегружать можно?! Да что за день сегодня такой!
— С ними много чего можно делать, но не будем об этом.
— Перегрузка – это очень простая операция. На самом деле – это даже не операция над методами, хотя иногда ее называют страшным словом – параметрический полиморфизм.
Дело в том, что все методы внутри класса должны иметь уникальные имена.
— Так вот, это не совсем так. Вернее совсем не так. Метод не должен иметь уникальное имя. Уникальным должно быть объединение из имени и типов параметров этого метода. Их еще называют сигнатурами методов.
Код | Описание |
---|---|
public void print(); public void print2(); | Так можно. Два метода имеют уникальные имена. |
public void print(); public void print(int n); | И так можно. Два метода имеют уникальные имена (сигнатуры). |
public void print(int n, int n2); public void print(int n); | Все еще уникальные методы. |
public int print(int a); public void print(int n); | А так нельзя. Методы не уникальные, хоть и возвращают разные типы. |
public int print(int a, long b); public long print(long b, int a); | А так – можно. Параметры методов уникальные. |
— Где-то я уже такое видел.
— Ага. Когда ты пишешь System.out.println, Intellij IDEA подсказывает тебе и выдает в подсказке пару десятков методов print с разными параметрами. Компилятор просто определит нужный метод, по типам переменных, которые ты туда передаешь, и пропишет вызов именно его.
— Это, вроде, не сложно. Не полиморфизм, однако.
Кстати, обращаю твое внимание, что имена параметров роли не играют – они теряются при компиляции. После компиляции о методе известно только его имя и типы параметров.
4. Задачи на перегрузку методов
— Привет, Амиго! А вот и снова я. Принес тебе в подарок несколько интересных задач. И не благодари. Бывай, Амиго.
Задачи |
---|
1. print(int) и print(String) Написать пять методов print с разными параметрами. |
4. Три метода возвращают минимальное из двух переданных в него чисел5. Абстрактные классы— Привет, Амиго! Новая интересная тема. — Да сегодня просто день интересных тем!! — Помнишь ситуацию, когда мы ввели базовый класс ChessItem для упрощения всех классов шахматных фигур? — Теперь представь, что у каждой фигуры есть метод, который занимается ее отрисовкой на экране. Вызываешь метод, и фигура сама себя рисует в своих текущих координатах. Удобно было бы вынести этот метод в базовый класс? — Да. После того, что я узнал о полиморфизме, можно было бы вызывать метод отрисовки для всех фигур, независимо от их типа. Примерно так: //рисуем их независимо от их типа. |
— Молодец. Именно так. А что бы отрисовал на экране метод draw самого класса ChessItem?
— Не знаю. Такой фигуры ведь в шахматах нет. Значит, и изображения у нее нет.
Для такого случая в Java есть специальный тип классов – абстрактные классы. Вот три вещи, которые стоит помнить об абстрактных классах.
1) Абстрактный класс может содержать объявление метода без его реализации. Такой метод называется абстрактным.
Пример | |||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
public abstract class ChessItem < public int x, y; //координаты private int value; // «ценность» фигуры public int getValue() //обычный метод, возвращает значение value public abstract void draw(); //абстрактный метод. Реализация отсутствует. 2) Абстрактный метод помечается специальным ключевым словом abstract. 3) Создавать объекты абстрактного класса нельзя. Такой код просто не скомпилируется.
— Можно. Но эти ограничения сродни модификатору private. Мы специально запрещали с помощью private прямой доступ к данным, чтобы другие программисты и их классы пользовались только написанными нами public-методами. То же и с абстрактным классом. Тот, кто написал этот класс, не хочет, чтобы создавались его объекты. Наоборот, он рассчитывает на то, чтобы от его абстрактного класса наследовались и переопределяли абстрактные методы. — Все равно не понятно, зачем усложнять себе жизнь? — Преимущество этого проявляется в больших проектах. Чем больше классов, тем чётче приходится очерчивать их роли. Ты увидишь преимущество этого, и уже в ближайшем будущем. Все через это проходят. 6. Задачи на абстрактные классы— Привет, Амиго! Ты так классно справился с предыдущими задачами. Я решил поискать для тебя задачи посложнее. — Спасибо, Диего. Ты настоящий друг. Вот уж не ожидал.
— Чертовски интересно. Даже и не думал, что интерфейсы – такая интересная тема. 9. Задачи на интерфейсы— Привет, Амиго! Скоро интерфейсы будут тебе сниться. Так что я бы на твоем месте не спал. Вообще! Ха-ха! Вот тебе пара задачек. Пусть интерфейсы навсегда останутся в твоей памяти.
|