Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> non-static метод в конструкторе, не статические методы в конструкторе 
:(
    Опции темы
priam220
Дата 3.12.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Cannot refer to an instance method while explicitly invoking a constructor
не совсем понятна ошибка при выполнении следующего кода:
Код

public class MyClass {
    int x;
    
    MyClass(int x)
    {
        System.out.print(x);
        getValue(10);           // ошибки нет
    }
    
    MyClass()
    {
        this (getValue(10));  // ошибка компиляции
    }    
    
    
    
    private int getValue(int _x)
    {
        return x = _x;
    }
    
    public static void main (String[] args){
        }
}


Почему появляется ошибка в одном случае, а во втором, - нет?


PM MAIL   Вверх
kemiisto
Дата 3.12.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(priam220 @  3.12.2010,  13:42 Найти цитируемый пост)
Почему появляется ошибка в одном случае, а во втором, - нет?

Цитата
An explicit constructor invocation statement in a constructor body may not refer to any instance variables or instance methods declared in this class or any superclass, or use this or super in any expression; otherwise, a compile-time error occurs.

Пруф.




--------------------
PM MAIL WWW GTalk Jabber   Вверх
priam220
Дата 3.12.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Цитата(kemiisto @  3.12.2010,  15:49 Найти цитируемый пост)
constructor invocation statement in a constructor body may not refer to any instance variables or instance methods


getValue()  есть instance method. Почему же тогда мы его можем вызывать без this ?

Добавлено через 3 минуты и 49 секунд
сорри, кажется понял значение invocation statement. Ок, спасибо.
PM MAIL   Вверх
kemiisto
Дата 3.12.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(priam220 @  3.12.2010,  14:10 Найти цитируемый пост)
getValue()  есть instance method.

Это для Вас откровение? smile 

Цитата(priam220 @  3.12.2010,  14:10 Найти цитируемый пост)
Почему же тогда мы его можем вызывать без this ?

У Гослинга спросите. 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
priam220
Дата 3.12.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



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

Добавлено через 3 минуты и 1 секунду
Цитата(kemiisto @  3.12.2010,  16:18 Найти цитируемый пост)
У Гослинга спросите



к сожалению с таким человеком не знаком.


PM MAIL   Вверх
kemiisto
Дата 3.12.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(priam220 @  3.12.2010,  14:23 Найти цитируемый пост)
А зачем этот запрет? Ведь мы же можем использовать "instance method", если не передаем его в качестве значения, внутри конструктора.

priam220, это вот уже куда интереснее. Вообще, конструкторы - штука жутко сложная. Все языки, поддерживающие ООП можно разделить на 2 группы: 
  • явно поддерживающие конструкторы и ссылку на текущий объект (this/self). С++, Java, C#, ...
  • явно неподдерживающие конструкторы и ссылку на текущий объект. Oberon-2, Python, Fortran, ...
По моему скромному опыту, первый путь существенно усложняет язык без видимых преимуществ. Wrong way, короче.

Это сообщение отредактировал(а) kemiisto - 3.12.2010, 16:30


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Skipy
Дата 3.12.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Цитата(priam220 @ 3.12.2010,  16:23)
А зачем этот запрет? Ведь мы же можем использовать "instance method", если не передаем его в качестве значения, внутри конструктора.

Внутри конструктора у Вас есть this. И если не указан в явном виде объект, на котором вызывается метод, используется именно this. Снаружи конструктора у Вас объекта нет - Вы его еще не создали.

Добавлено через 1 минуту и 5 секунд
Цитата(kemiisto @ 3.12.2010,  16:30)
По моему скромному опыту, первый путь существенно усложняет язык без видимых преимуществ. Wrong way, короче.

Странно. 15 лет использую, сложностей не вижу. Просветите?


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
kemiisto
Дата 3.12.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(Skipy @  3.12.2010,  15:48 Найти цитируемый пост)
Странно. 15 лет использую, сложностей не вижу. Просветите?

Не буду. Если Вы их за 15 лет не увидели, Вам уже ничего не докажешь.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
nc30
Дата 3.12.2010, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Да, со static работает...
Код

public class MyClass {
    static int x;

    MyClass(int x)
    {
        System.out.print(x);
        getValue(10);           // ошибки нет
    }

    MyClass()
    {
        this(getValue(10));  // ошибки нет
    }

    private static int getValue(int _x)
    {
        return x = _x;
    }

    public static void main (String[] args){

        MyClass mc = new MyClass();
    }
}

Пока еще ни разу не видел такого синтаксиса у this, было интересно попробовать smile

Это сообщение отредактировал(а) nc30 - 3.12.2010, 21:48
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1108 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.