如何使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
}
任何帮助......谢谢
答案 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?它们应该是无效的。