Вопрос по static, oop, this, java – Почему мы не можем использовать ключевое слово this в статическом методе

30
class Sub {
    static int y;
    public static void foo() {
         this.y = 10;
    }
}

Я это понимаюthis представляет объект, вызывающий метод, и что статические методы не привязаны ни к какому объекту. Но в вышеупомянутом случае переменная y также является статической.

Если мы можем вызвать статический метод для объекта класса, почему мы не можем позволить статическим методам устанавливать статические переменные класса.

Какова цель этого дополнительного ограничения?

Я понимаю, что это древний вопрос, но я хочу добавить +1 к нему как к вполне обоснованному вопросу. Хотя для полей ответ прост (не указывайте квалификатор), для статических внутренних классов он становится релевантным, а также релевантным, когда требуется ссылка на экземпляр времени выполнения самого класса. Например, я могу напечатать «MyClass.class». чтобы получить синглтон-класс & lt; MyClass & gt ;, но просто "класс" сам по себе является недействительным, и подобного обходного пути нет. Это приводит к тому, что имя класса может повторяться через модуль, который не очень СУХОЙ. Mark McKenna

Ваш Ответ

9   ответов
2

class Sub {
    static int y;
    public static void foo() {
         Sub.y = 10;
    }
}

Вы можете установить статические поля в статических методах, но у вас нет доступа кthis в статическом методе, потому чтоthis представляет текущий экземпляр объекта, а в статическом методе у вас нет экземпляра.

Не могли бы вы объяснить, в чем проблема моего ответа или ответа @ Peter?
Там нет ничего плохого в вашем ответе. Upvoted это к 0 снова. (что дает вам +8 повторений в целом из-за дурацкой системы голосования и повторения ^^)
0

& Quot; это & Quot; Ключевое слово применимо только тогда, когда создается экземпляр объекта. потому что статический метод принадлежит области класса.

0

this & quot; относится к объекту, с которым вы работаете. В вашем случае это внутри любых нестатических методов или конструктора (если у вас есть один и если вы используете внутри него "this" ", то" this "" относится к тому конкретному экземпляру класса Sub.So, он применим только при создании объекта. Но все, что находится в статическом контексте класса, вы можете использовать, даже не создавая объект для этого, поскольку это разрешается во время загрузки класса. & Quot; это & Quot; разрешается только при создании объекта (вы даже можете динамически сказать, для какого объекта). Так что "это" имеет смысл в статическом контексте. Надеюсь, поможет. Бог благословил.

6

по которой мы не можем использовать «это» в контексте статического метода: -

это: - "это" означает текущий класс OBJECT, поэтому ясно, что & quot; this & quot; только заходи изображение, как только мы намеревались создать объект этого класса.

статический метод: нет необходимости создавать объект для использования статического метода. означает «экземпляр» или создание объекта не имеет никакого смысла со «статичным» согласно правилу Java.

Так что будет противоречие, если мы будем использовать оба вместе (статический и этот). По этой причине мы не можем использовать «это» в статическом методе.

Вы только что упомянули, что есть правило Java, чтобы не использовать экземпляр класса для вызова статических полей. Нет такого правила (й) Java, скорее, у него есть какая-то конкретная причина », статические поля / методы создаются и хранятся в области памяти, называемойPermGen только во время компиляции. Статические объекты являются частью только класса, поэтому мы можем обращаться к ним по имени класса напрямую, не нужно создавать экземпляр для доступа к ним & quot ;.
0

а метод является статическим, тогда это делится между объектами, где это ключевое слово указывает только на текущий объект. Предположим, что вы создали пять объектов класса foo, и только один экземпляр из (int y) уничтожен всеми объектами. Поэтому, если вы обращаетесь к int y с помощью этого ключевого слова, компилятор получает неоднозначность, на которую должен указывать объект, потому что static int y является общим по всему объекту. у вас есть доступ к статической переменной, используя имя класса.

0

которые ответили до меня. Позвольте мне попробовать это по-другому, чтобы ответить на это:

Я предполагаю, что метод экземпляра / нестатический метод принадлежит экземпляру класса (то есть рано или поздно нам понадобится объект ref для доступа к нему), поэтому это ключевое слово имеет смысл внутри блока или метода экземпляра. Но статическое ключевое слово для любого члена класса интерпретируется как прямой актив для класса, к которому объект, если он существует, имеет к нему доступ. Так что в статическом контексте он не уверен, что объект где-то существует. Вот почему использование этого в статической области не разрешено в Java.

6

this ссылается на этот экземпляр объектаSub, Как методstaticнет ни одного случаяSub.

75

this ссылается на экземпляр объекта. В вызове статического метода нет экземпляра объекта. Но, конечно, вы можете получить доступ к своему статическому полю (только к статическим!). Просто используйте

class Sub {
    static int y;
    public static void foo() {
         y = 10;
    }
}

Если вы хотите убедиться, что вы получаете статическое полеy а не какая-то локальная переменная с тем же именем, используйте имя класса, чтобы указать:

class Sub {
    static int y;
    public static void foo(int y) {
         Sub.y = y;
    }
}
@AndrewCone спасибо за отзыв. Вы делаете очень хорошее замечание (о том, почему я получил отрицательный голос). И по теме: я думаю, что причина в том, что Java сосредоточена на том, чтобы иметь (или, по крайней мере, пытаться иметь) чистую объектно-ориентированную структуру. Когда вы перегружаете ключевое слово, ухудшается читаемость. С текущим определением, когда вы читаетеthis.y, выknowэто локальная переменная, а не статическая переменная. Так что чище.
Это не совсем верно, хотя я предоставил объяснение, почемуthis не могут быть использованы в статических методах (потому что нет экземпляра класса, который должен быть названthis) и показал два способа доступа к полям. Возможность использоватьthis в статическом контексте в качестве замены имя класса будет ошибочным и противоречивым (по крайней мере, imho). Спасибо за ваш отзыв, хотя, возможно, это было причиной для отрицательных голосов.
Ответные за сомнение, возможно, думали, что это на самом деле не отвечает на вопрос, потому что вы в основном повторили то, что ОП уже знало, и предоставили только подробный обходной путь. Если класс названThisClassHasAQuiteLongName, не было бы лучше назвать класс какthis в статических методах?
Вопрос, насколько я понял, и который я также хочу знать, заключается в том, почему Java не перегружает значениеthis в статическом контексте, чтобы означать класс, так что вместоSub.y можно было набратьthis.y, Казалось бы, очевидный выбор дизайна, потому что он устраняет необходимость явного упоминания имени класса, которое может измениться. В общем, когда кто-то спрашивает "почему x определено как y, а не как z в другом контексте" он не является удовлетворительным, и на самом деле довольно токсичным и снисходительным, чтобы ответить «потому что он определен как y». Это заставило меня чувствовать себя глупым из-за того, что я удивляюсь так же, как и я до сих пор.
2

но не один. В вашем случае вы можете использовать имя класса, как подсказывает @tibtof.

Похожие вопросы