Давно хотел спросить. Когда вижу код подобный этому:
public class Solution
{
public Solution method1 (String s)
{
// bla-bla
}
}
... когда начинается описание класса и тут же внутри него описывается метод, имеющий тип этого же класса - мне всегда это кажется нелогичным.
Ведь класс ещё не описан до конца и не создан, да и вообще как это можно так внутри самого себя свой же тип использовать для метода?
Вот если бы было например 2 класса: один Solution, а другой скажем Answer. И метод Solution method1() объявлялся бы в классе Answer - тогда бы это казалось понятным и логичным. Т.е. сначала об"является новый класс (тип данных) Solution, а уже затем, когда он существует - его можно начинать использовать как тип для описания новых методов.
Как бы разобраться с этим? Может кто объяснить или посоветовать что почитать по этому поводу?
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
т.е. в сокращенном варианте приведение все-таки неявно существует.
Почему в строке «a» всё хорошо, а в строке «b» плохо?!
В вашем случае, во строке b есть int, соответственно тип всего выражения s+i повыситься до int, а дальше вы пытаетесь положить в short значения типа int, чего не сделать без приведения типов(сужение).
IDEA подчеркивает а1 красным:
Invalid method declaration; return type required
Почему так, ведь void стоит же, значит никакого возвращаемого типа вообще не нужно? В чём здесь загвоздка?
Или как метод называется: а1 или method?
а может void это вообще Ваш личный модификатор доступа?
Почему компилятор не дайт вывести значение переменной ни в первом ни во втором случае?
Короче код должен быть таким:
то всё работает, в том числе и строка . Что же тогда при этом в ней происходит? Где то же присваивается что а равна 5, хоть а и не статическая. Или как?
Код работает и выводит 4
Что представляется несколько непонятным поскольку как мне думается код не должен компилироваться из-за присваивания
Ведь здесь переменной а типа int присваивается логическое значение false
Как тут разобраться?
Итак
Проверям, истина или ложь
у нас x = false; Значит выполняется ветка else
а именно код
По тернарному оператору
а так как у вас
Или же во вложенном статическом классе надо будет тоже писать в сигнатуре: implements InterfaceName?
1. Его имя начинается с имени внешнего класса: Package.OuterClass.NestedClass.
2. Он делит одну и ту же область видимости, что и внешний класс. (private обьекты и методы видны друг другу в обе стороны).
В остальном же, внешний и вложенный класс никак не связаны.
Эту сущность можно редактировать.
Есть пользователи, которые используют сущность для своих целей, например, изменяют ее.
Случаются неправильные обновления, например, оператор ошибся и затер важные данные.
Какие предложите архитектурные решения, чтобы можно было восстановить данные?
Какой паттерн будете использовать, чтоб избавиться от этой ненавистной NPE?
Какую аннотацию используют многие фреймворки для параметров методов, чтобы не проверять аргументы на null?
Предположим, приложение имеет список действий, которые выполняются последовательно. Каждый объект каждого действия имеет метод М, который показывает, сколько времени предположительно займет выполнение этого действия. Метод М используется прогресс-баром для подсчета продолжительности исполнения всех действий.
Какой паттерн будете использовать?
2) все сообщения должны быть обработаны хотя бы одним объектом системы
3) сообщения в системе обрабатываются по схеме «обработай сам либо перешли другому», то есть одни сообщения обрабатываются на том уровне, где они получены, а другие пересылаются объектам иного уровня
Какой паттерн?
Почему плохо использовать double для хранения суммы денег?
Как решить эту проблему?
Конструктор использовать только со стринговым параметром
BigDecimal pi = new BigDecimal(«3.14»);
Если как утверждается каждый класс является наследником класса Object…
то почему тогда в описании некоторых классов в разделе «Methods inherited from class java.lang.Object» указаны не все эти 11 методов, а меньше, например только 8?
Откровенно говоря ответ находится в плоскости -> модификаторы доступа.
Начнем с того что 2 метода таких как clone() и finalize() имеют protected доступ. Так что эти два метода нужно сперва @Override либо создать класс в package java.lang. Там любой класс будет иметь все 11 методов.
А как всё-таки получается лишь с 8?
Methods inherited from class java.lang.Object: clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Не думаю, что есть смысл объяснять как работают модификаторы доступа но подумайте вот о чем почему этот код компилируется без проблем, понятно что упадет по runtime но тут разговор о доступности всех 11 методов.
Итог прост. Любой обьект в java имеет доступ ко всем 11ти методам класса Object. Осталось только узнать как же именно работает protected-) удачи
а вот так подчеркивает как ошибку:
?
А перед возвращаемым значением разрешено использовать модификаторы.
8.4. Method Declarations
Глянь пост "Книги по Java" и "вопрос по поводу Java", а также "Топ 10 вопросов о коллекциях в Java", "10 ошибок зачастую допускаемых Java разработчиками", "
Вот пример расчета уравнения 4 * (x1 — x2) * (x1 — x2):
Вот пример с классом String:
:)
Однако, можно сделать рекурсивный вызов и тогда JVM ругнется, что стек забит:
Кинет Exception in thread «main» java.lang.StackOverflowError
А так если своими словами(ну т. е. моими :) ). То:
Метод требует чтобы то что он вернул было того же типа что и класс — вот и все. К примеру: так как метод не статический то он будет вызываться у объекта, а это значит что объект будет создан, будут созданны все переменные этого объекта.