如何使变量的范围全局(不使它实际上是全局的)

时间:2011-09-29 00:41:17

标签: java function global string

如何使String变量的范围(在Java中)全局。从另一个函数访问它 例如

//String b="null"; I don't want to do this... because if i do this, fun2 will print Null

    public int func1(String s)
    {

    String b=s;

    }

    public int func2(String q)
    {

    System.out.println(b);//b should be accessed here and should print value of s

    }

任何帮助......谢谢

2 个答案:

答案 0 :(得分:6)

OOP的一个基本概念是范围的概念:在几乎所有情况下,明智的做法是将变量的范围(即可见的范围)减小到最小可行范围。

我假设您绝对需要在两个函数中使用该变量。因此,在这种情况下,最小可行范围将涵盖两种功能。

public class YourClass
{
   private String yourStringVar;

   public int pleaseGiveYourFunctionProperNames(String s){
      this.yourStringVar = s;
   }
   public void thisFunctionPrintsValueOfMyStringVar(){
      System.out.println(yourStringVar);
   }
}

根据具体情况,您必须评估变量所需的范围,并且必须了解增加范围的含义(更多访问权限=可能更多的依赖关系=更难跟踪)。

作为一个例子,假设您绝对需要它作为GLOBAL变量(正如您在问题中所说的那样)。应用程序中的任何内容都可以访问具有全局范围的变量。这非常危险,我将证明这一点。

要创建具有全局范围的变量(在Java中没有诸如全局变量之类的东西),您可以使用静态变量创建一个类。

public class GlobalVariablesExample
{
   public static string GlobalVariable;
}

如果我要更改原始代码,现在看起来就像这样。

public class YourClass
{
   public int pleaseGiveYourFunctionProperNames(String s){
      GlobalVariablesExample.GlobalVariable = s;
   }
   public void thisFunctionPrintsValueOfMyStringVar(){
      System.out.println(GlobalVariablesExample.GlobalVariable);
   }
}

这可能非常强大,而且非常危险,因为它可能导致你不期望的奇怪行为,并且你失去了面向对象编程给你的许多能力,所以要小心使用它。

public class YourApplication{
    public static void main(String args[]){
        YourClass instance1 = new YourClass();
        YourClass instance2 = new YourClass();

        instance1.pleaseGiveYourFunctionProperNames("Hello");
        instance1.thisFunctionPrintsValueOfMyStringVar(); // This prints "Hello"

        instance2.pleaseGiveYourFunctionProperNames("World");
        instance2.thisFunctionPrintsValueOfMyStringVar(); // This prints "World"
        instance1.thisFunctionPrintsValueOfMyStringVar(); // This prints "World, NOT Hello, as you'd expect"
    }
}

始终评估变量的最小可行范围。不要让它比它需要的更容易访问。

另外,请不要将变量命名为a,b,c。并且不要将变量命名为func1,func2。它不会使你的应用程序变慢,也不会因为输入一些额外的字母而杀死你。

答案 1 :(得分:1)

嗯。你显然需要一些面向对象编程的课程。在OO中没有“全局”变量。但是,任何定义为类(在方法之外)中的成员的变量在该类中都是全局的。

public class MyClass {

    private String myVar; // this can be accessed everywhere in MyClass

    public void func1(String s) {
        myVar = s;
    }

    public void func2(String q) { // why is q needed here? It's not used
        System.out.println(myVar);
    }

}

因此,如果先调用func1,func2将输出s的值。

final Myclass myClass = new MyClass();
myClass.func1("value");
myClass.func2("whatever"); // will output "value"

另外,为什么这些方法在你的例子中返回int?它们应该是无效的。