Можно ли избежать использования «static» при вызове переменной из другого класса?

#java #class

#java #класс

Вопрос:

Можно ли избежать использования «static» при вызове переменной из другого класса? большое вам спасибо

Вот мой код.

 class Hello {
  public static String say = "Hello World";  //I using static       
  public void born() {                    
    System.out.println(say);
  }
}

public class SayHello extends Hello {
  public static void main(String[] args) {
    Hello myHello = new Hello();
    myHello.born();
    System.out.println(say);

  }
  

Вывод:

 Hello World
Hello World
  

Если я использую public String say = "Hello World";

вывод Hello World null

Есть идеи, как избежать использования «static» при вызове переменной из другого класса? большое вам спасибо

Комментарии:

1. почему вы хотите избежать использования static? в чем ваша проблема?

2. вы не можете напрямую обращаться к переменной другого класса

3. @user1583465 Вы можете, если переменная является статической или если это общедоступная переменная экземпляра. В примере OP создание say нестатического и доступ к нему, как myHello.say к работам.

4. Я имею в виду без classname / class object

5. @user1583465 Но в данном случае это не применимо. Обратите внимание, что в коде OP есть два класса, и один расширяет другой. Строка say является членом обоих классов, поскольку она объявлена в родительском классе.

Ответ №1:

Если вы удалите static , он не будет компилироваться. Статические поля можно пометить private , если вы хотите их скрыть. Таким образом, они доступны только для всех экземпляров класса Hello . Правильный способ изменения или получения будет:

 class Main extends Hello {
  public static void main(String[] args) throws Exception {
    Hello myHello = new Hello();
    myHello.born();
    // System.out.println(say); //doesn't allow access
    // System.out.println(Hello.say); //doesn't allow access
    System.out.println(myHello.getSay());
  }
 
}

class Hello {
  private static String say = "Hello World";  //private      
  public void born() {                    
    System.out.println(say);
  }

 public String getSay() {
  return say;
 }
}
  

Ответ №2:

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

Итак, если вы не хотите использовать static, вы не можете использовать его в других экземплярах class .

Ответ №3:

Да, если вы не объявляете ее статической, вы можете ссылаться на нее из экземпляра : myHello.say . Это то же самое, что и для вызова функции.

 public class SayHello extends Hello {
  public static void main(String[] args) {
    Hello myHello = new Hello();
    myHello.born();
    System.out.println(myHello.say);
  }
}
  

Для константы, т.е.. строка, которая никогда не меняется и одинакова для всех экземпляров класса, имеет смысл объявить ее статической и использовать как таковую.

Ответ №4:

Если вы не пометите строку as static , вы получите ошибку компиляции, потому что при выполнении System.out.println(say) в main методе, который вы используете say в статическом контексте (поскольку main метод должен быть статическим).

Если вы удалите System.out.println(say); и просто оставите myHello.born(); , тогда нет необходимости say быть статичным, потому что вы будете использовать его только из нестатических методов (т. Е. born() Метода). Вы можете видеть это в этом примере, где я прокомментировал эту строку и определил say как не являющуюся статической.

Другим вариантом было бы сделать println подобное, поскольку переменная является общедоступной: System.out.println(myHello.say);