#java #class #scope
#java #класс #область видимости
Вопрос:
Я на удивление нахожу это запутанным. Должно быть, я что-то упускаю.
Итак, у меня есть этот простой синтаксис
public class OMG{
public static void main(String args[]){
int hi=2;
letsDoIt();
System.out.println(hi);
}
public static void letsDoIt(){
hi =1;
}
}
Очевидно, что это вызывает ошибку, поскольку hi является локальной переменной.
Исходя из моего опыта работы с python, я добавил this
public class OMG{
public static void main(String args[]){
int hi=2;
letsDoIt();
System.out.println(hi);
}
public static void letsDoIt(){
this.hi =1;
}
}
Что добавляет дополнительную ошибку, когда нестатическая переменная не может быть доступна из статического метода.
Я добавил static
в hi
public class OMG{
public static void main(String args[]){
static int hi=2;
letsDoIt();
System.out.println(hi);
}
public static void letsDoIt(){
this.hi =1;
}
}
Компилятор ругает меня за недопустимое выражение. Я заменяю статическое значение на private
(на что некоторые SO отвечают, рекомендуют), но с той же ошибкой.
В чем моя ошибка? Могу ли я как-нибудь решить эту проблему, не создавая глобальный класс?
Комментарии:
1. Вы должны
static int hi=2;
вывести изmain
тела метода.2. Вы должны начать с чтения руководства по Java, а не основывать его синтаксис на каком-либо другом языке.
3. Я предлагаю вам ознакомиться с концепцией области видимости . Смотрите также здесь . Затем вы можете захотеть выяснить, что
static
означает ключевое слово при применении к методу.4. @SotiriosDelimanolis К сожалению, мне не удалось найти учебник по Java, который охватывает это. У меня есть книга по Java рядом со мной, но ничего об «этом», поэтому я сделал попытку в темноте.
5. Вы не смогли найти книгу или учебное пособие, в котором рассматриваются ключевые
this
слова иstatic
?
Ответ №1:
Вы не можете объявлять static
переменные внутри метода, потому static
что модификатор означает, что метод или поле принадлежат классу.
Самым простым решением этой проблемы было бы объявить переменную как static
переменную класса. Используя этот подход, вам также необходимо удалить this
from this.hi
в lestDoIt
методе. Код будет выглядеть следующим образом:
public class OMG {
static int hi=2;
public static void main(String args[]) {
letsDoIt();
System.out.println(hi);
}
public static void letsDoIt() {
hi =1;
}
}
Другим решением может быть использование static
переменной non hi
. Для этого вам также потребуется удалить static
модификатор letsDoIt
метода для доступа к hi
полю, поскольку static
методы не могут получить доступ к полям экземпляра, поскольку, как объяснено выше, static
означает, что метод или поле принадлежит классу, а не конкретному объектному экземпляру класса.
Решение было бы:
public class OMG {
int hi=2;
public static void main(String args[]) {
//note that we have to create a new instance of OMG
//because, again, static methods cannot access to non-static methods/fields
OMG omg = new OMG();
omg.letsDoIt();
System.out.println(omg.hi);
}
public void letsDoIt() {
this.hi =1;
}
}
Подробная информация:
Ответ №2:
Есть два элемента, вызывающие вашу проблему.
- переменная
hi
должна ссылаться в общем контексте между вашимmain
методом и вашимletsDoIt
методом - поскольку ваш
main
методstatic
, и, следовательно, вашletsDoIt
, будет иметь видимость только дляstatic
полей (если не передан экземпляр в качестве аргумента, то есть)
Следовательно:
-
Объявить
hi
какstatic
полеOMG
:public class OMG { static int hi; ...
-
Удалите объявление локальной переменной в вашем
main
методе. -
Ссылайтесь на нее с
OMG.hi
помощью или толькоhi
вstatic
контексте, а не сthis.hi
помощью, какthis
подразумевает экземплярMain
, который не виден изstatic
контекста
Ответ №3:
Вы не можете выполнить «this.hi =1» в статическом контексте, и для доступа к переменной hi из «letsDoIt ()» вы должны объявить ее как переменную класса, как я сделал в приведенном ниже коде:
public class OMG{
public static int hi;
public static void main(String args[]){
hi=2;
letsDoIt();
System.out.println(hi);
}
public static void letsDoIt(){
hi =1;
}
}
Комментарии:
1. @LuiggiMendoza Нет, вы не можете. As
this
относится к insance, а вstatic
контексте экземпляра вообще нет. Он не будет компилироваться.2. @Обратная косая черта ах да, я забыл, что метод был
static
, глупый я :).
Ответ №4:
Статические переменные — это переменные класса, а не его экземпляры. Вы не можете иметь статическую переменную внутри метода.
Чтобы исправить эту ошибку, переместитесь hi
за пределы основного метода (сохраняя его статическим). Также избавьтесь от this
in letsDoIt()
.
public class OMG {
static int hi=2;
public static void main(String args[]){
letsDoIt();
System.out.println(hi);
}
public static void letsDoIt() {
hi =1;
}
}
Комментарии:
1. Я не понимаю, почему вы даете лучшее объяснение
static
ключевому слову на Java в другом вопросе, но не здесь…2. Также удалите
this
ссылку вletsDoIt
методе3. @LuiggiMendoza я не понимаю. Еще один вопрос, на который я ответил? Вы знаете, какой из них?