Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > non-static метод в конструкторе


Автор: priam220 3.12.2010, 15:42
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){
        }
}


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


Автор: kemiisto 3.12.2010, 15:49
Цитата(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.

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.7.1.


Автор: priam220 3.12.2010, 16:10
Цитата(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. Ок, спасибо.

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

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

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

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

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

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



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


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

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

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

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

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

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

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

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

Автор: nc30 3.12.2010, 21:23
Да, со 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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)