Как мне ссылаться на переменную из метода в том же классе

#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 я не понимаю. Еще один вопрос, на который я ответил? Вы знаете, какой из них?