JavaRush /Java блог /Архив info.javarush /Вопросы по пониманию Java
Hehabr
13 уровень
Peine

Вопросы по пониманию Java

Статья из группы Архив info.javarush
Давно хотел спросить. Когда вижу код подобный этому: public class Solution { public Solution method1 (String s) { // bla-bla } } ... когда начинается описание класса и тут же внутри него описывается метод, имеющий тип этого же класса - мне всегда это кажется нелогичным. Ведь класс ещё не описан до конца и не создан, да и вообще как это можно так внутри самого себя свой же тип использовать для метода? Вот если бы было например 2 класса: один Solution, а другой скажем Answer. И метод Solution method1() объявлялся бы в классе Answer - тогда бы это казалось понятным и логичным. Т.е. сначала об"является новый класс (тип данных) Solution, а уже затем, когда он существует - его можно начинать использовать как тип для описания новых методов. Как бы разобраться с этим? Может кто объяснить или посоветовать что почитать по этому поводу?
Комментарии (55)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
gnev Уровень 24
5 сентября 2015
Потому что будет вот так
A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

For example, the following code is correct:

short x = 3;
x += 4.6;
and results in x having the value 7 because it is equivalent to:

short x = 3;
x = (short)(x + 4.6);

т.е. в сокращенном варианте приведение все-таки неявно существует.
Hehabr Уровень 13
5 сентября 2015

        short s = 1;
        int i = 1;

        s += i ;    // a
        s = s+i ;   // b


Почему в строке «a» всё хорошо, а в строке «b» плохо?!
Hehabr Уровень 13
18 августа 2015
class A
{
    void method a1()
    {
       
    }
}


IDEA подчеркивает а1 красным:
Invalid method declaration; return type required

Почему так, ведь void стоит же, значит никакого возвращаемого типа вообще не нужно? В чём здесь загвоздка?
Hehabr Уровень 13
25 июля 2015
public class Test
{
    static { int a=5; }

    public static void main(String[] args)
    {
        System.out.println(a);    //  1
        Test t = new Test();
        System.out.println(t.a);  //  2
    }
}


Почему компилятор не дайт вывести значение переменной
a
ни в первом ни во втором случае?
Hehabr Уровень 13
22 июля 2015
Спасибо за подсказки. Дошло когда представил проблемный кусок кода со скобками. Вот так:
else a = ( x ? 3 : 4 ) ; 
Hehabr Уровень 13
22 июля 2015
public class test
{
    public static void main(String[] args)
    {
        boolean x=false;
        int a;
        if(x) a = x ? 1 : 2;
        else a = x ? 3 : 4;
        System.out.println(a);
    }
}


Код работает и выводит 4
Что представляется несколько непонятным поскольку как мне думается код не должен компилироваться из-за присваивания
a = x

Ведь здесь переменной а типа int присваивается логическое значение false

Как тут разобраться?
Hehabr Уровень 13
19 марта 2015
Подскажите если класс реализует интерфейс InterfaceName, то будет ли вложенный статический класс наследовать эту реализацию?
Или же во вложенном статическом классе надо будет тоже писать в сигнатуре: implements InterfaceName?
Diana Уровень 41
19 марта 2015
Есть сущность(объект), которая хранит важные данные.
Эту сущность можно редактировать.

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

Какие предложите архитектурные решения, чтобы можно было восстановить данные?
Diana Уровень 41
19 марта 2015
Приложение постоянно падает с NPE.

Какой паттерн будете использовать, чтоб избавиться от этой ненавистной NPE?

Какую аннотацию используют многие фреймворки для параметров методов, чтобы не проверять аргументы на null?
Diana Уровень 41
19 марта 2015
В приложении есть Прогресс бар.

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

Какой паттерн будете использовать?