#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);