在Java中如何定义全局变量?
在Java中如何定义全局变量?
为定义全局变量,你可以使用 static 关键字。
public class Example {
public static int a;
public static int b;
}
现在你可以通过调用 a 和 b 来从任何地方访问它们。
Example.a;
Example.b;
static
关键字使变量在类加载时全局可访问。 - sjasGlobal
改为其他名称(比如 TestClass
),以免让人们误认为这是 Java 的关键字。谨慎总比后悔好 :) - Nicolas Rinaudo不需要这样做,这是有意设计的。即使你可以这样做,你也不应该这样做。
话虽如此,你可以在一个名为Globals的类中创建一组公共静态成员。
public class Globals {
public static int globalInt = 0;
///
}
但你真的不应该这样做:)。说真的...不要这么做。
另外一种方法是创建一个像这样的接口:
public interface GlobalConstants
{
String name = "Chilly Billy";
String address = "10 Chicken head Lane";
}
任何需要使用它们的类只需实现该接口:
public class GlobalImpl implements GlobalConstants
{
public GlobalImpl()
{
System.out.println(name);
}
}
你最好使用依赖注入:
public class Globals {
public int a;
public int b;
}
public class UsesGlobals {
private final Globals globals;
public UsesGlobals(Globals globals) {
this.globals = globals;
}
}
有很多好的答案,但我想给出这个例子,因为它被认为是通过另一个类访问类变量的更合适的方法:使用getter和setter。
为什么要以这种方式使用getter和setter而不是只将变量公开呢?原因是这样,假设你的变量将成为一个全局参数,在程序执行期间永远不会被更改(在与团队一起开发代码的情况下),比如可能是网站的URL。理论上,这可能会多次更改并在程序中使用,所以您希望使用全局变量以便能够一次性更新它。但是,您不希望其他人去更改此变量(可能没有意识到它的重要性)。在这种情况下,您只需不包括setter方法,仅包括getter方法即可。
public class Global{
private static int var = 5;
public static int getVar(){
return Global.var;
}
//If you do not want to change the var ever then do not include this
public static void setVar(int var){
Global.var = var;
}
}
public static class
吗? - Cloud ChoGlobal.java
的文件,那么这个类声明就无效了吗?实际上我把你的“Global”类做成了一个子类。 - Cloud Cho实际上,在Java面向对象程序中没有“全局”概念。
然而,你的问题背后确实有一些真相,因为会有一些情况需要在程序的任何部分运行方法。例如,在Phrase-O-Matic应用程序中,random()方法应该可以从程序的任何地方调用。
因此,为了满足类似于上述的需求,“我们需要像全局变量和方法这样的东西”。
要声明一个变量为全局变量:
1.Mark the variable as public static final While declaring.
声明方法为全局方法.
1. Mark the method as public static While declaring.
因为我将全局变量和方法声明为静态的,所以你可以通过以下代码在任何地方调用它们:Java 中没有全局变量。
然而,我们有一个 static
关键字, 这已经足够。在 Java 中,没有类外的东西存在。 static
关键字表示一个类变量,与实例变量相反,它只有一个副本并且跨越创建的该类的所有实例,这意味着它的值可以在任何实例中被更改和访问。
如果您需要一个可以超越作用域访问的全局变量,则需要使用此变量,但其范围仅限于类所在的范围。
除了常量,没有什么应该是全局的。
public class MyMainClass {
public final static boolean DEBUGMODE=true;
}
将此代码放入您的主类中。在其他 .java 文件中,通过以下方式使用:
if(MyMainClass.DEBUGMODE) System.out.println("Some debugging info");
确保在将您的代码从剪切室移出并发布时,删除或注释掉此功能。
如果您有一个像随机器这样的工作方法,我建议创建一个“工具箱”包!所有编程人员都应该有一个,然后每当您想在.java文件中使用它时,只需导入即可!
在Java中,不存在真正的全局变量。每个静态变量都必须属于某个类(比如System.out),但是当你决定将它放在哪个类中时,你可以在同一个类加载器加载的所有地方引用它。
请注意,在更新静态变量时,应始终进行保护以避免竞态条件。
我认为“全局变量”的资格是指在代码中任何地方都可以访问和更改,而不需要关心静态/实例调用或传递任何来自一个类到另一个类的引用。
通常如果你有A类:
public class A {
private int myVar;
public A(int myVar) {
this.myVar = myVar;
}
public int getMyVar() {
return myVar;
}
public void setMyVar(int mewVar) {
this.myVar = newVar;
}
}
我想要在B类中访问和更新myvar
。
public class B{
private A a;
public void passA(A a){
this.a = a;
}
public void changeMyVar(int newVar){
a.setMyvar(newVar);
}
}
int initialValue = 2;
int newValue = 3;
A a = new A(initialValue);
B b = new B();
b.passA(a);
b.changeMyVar(newValue);
assertEquals(a.getMyVar(),newValue); // true
那么,我的解决方案是使用单例模式(虽然我不确定这是否是一个好的做法):
public class Globals {
private static Globals globalsInstance = new Globals();
public static Globals getInstance() {
return globalsInstance;
}
private int myVar = 2;
private Globals() {
}
public int getMyVar() {
return myVar;
}
public void setMyVar(int myVar) {
this.myVar = myVar;
}
}
现在,您可以通过以下方式在任何地方获得全局唯一实例:
Globals globals = Globals.getInstance();
// and read and write to myVar with the getter and setter like
int myVar = globals.getMyVar();
global.setMyVar(3);