Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类范围变量与方法范围变量_Java_Variables_Scope - Fatal编程技术网

Java 类范围变量与方法范围变量

Java 类范围变量与方法范围变量,java,variables,scope,Java,Variables,Scope,我知道变量范围由块{的开始和块}的结束所包围。如果在块中声明了相同的变量,则会发生编译错误变量已定义。但看看下面的例子 public class Test{ int x=0;// Class scope variable public void m(){ int x=9; //redeclaration of x is valid within the scope of same x. if(true){ int x=7; // but this redeclar

我知道变量范围由块
{
的开始和块
}
的结束所包围。如果在块中声明了相同的变量,则会发生编译错误
变量已定义。但看看下面的例子

public class Test{
int x=0;// Class scope variable

public void m(){
  int  x=9;   //redeclaration of x is valid within the scope of same x. 

  if(true){
      int x=7; // but this redeclaration generates a compile time error.
  }

}
在这里,
x
可以在方法中重新声明,尽管它已经在类中声明。但是在
if
块中,
x
不能重新声明


为什么类范围变量的重新声明不会生成错误,而方法范围变量的重新声明会生成错误?

这是因为
int x=0
不是一个变量,而是一个实例字段。允许局部变量与字段具有相同的名称。为了区分变量和同名字段,我们对实例字段使用
this
前缀,对类字段使用类名。例如

int x = this.x

这是因为
int x=0
不是一个变量,而是一个实例字段。允许局部变量与字段具有相同的名称。为了区分变量和同名字段,我们对实例字段使用
this
前缀,对类字段使用类名。例如

int x = this.x

因为Java就是这样设计的。语言设计者可以很容易地做到这一点,因此不可能对局部变量和实例变量使用相同的名称。他们只是选择不这样做。

因为Java就是这样设计的。语言设计者可以很容易地做到这一点,因此不可能对局部变量和实例变量使用相同的名称。他们只是选择不这样做。

这里是一个java范围的好例子(来自OCA java SE-7)。这里z(类变量)在方法doStuff2内部初始化。类变量可以在方法内初始化,但如果在方法内重新声明相同的变量,则会在堆栈上而不是堆上创建新的局部变量

            public class ScopeTest
            {
            int z;
            public static void main(String[] args){
            ScopeTest myScope = new ScopeTest();
            int z = 6;
            System.out.println(z);
            myScope.doStuff();
            System.out.println(z);
            System.out.println(myScope.z);
            }
            void doStuff() {
            int z = 5;
            doStuff2();
            System.out.println(z);
            }
            void doStuff2()
            {
            z = 4;
            }
            }
输出:

6 
5 
6 
4 

下面是一个java作用域的好例子(来自OCA java SE-7)。这里z(类变量)在方法doStuff2内部初始化。类变量可以在方法内初始化,但如果在方法内重新声明相同的变量,则会在堆栈上而不是堆上创建新的局部变量

            public class ScopeTest
            {
            int z;
            public static void main(String[] args){
            ScopeTest myScope = new ScopeTest();
            int z = 6;
            System.out.println(z);
            myScope.doStuff();
            System.out.println(z);
            System.out.println(myScope.z);
            }
            void doStuff() {
            int z = 5;
            doStuff2();
            System.out.println(z);
            }
            void doStuff2()
            {
            z = 4;
            }
            }
输出:

6 
5 
6 
4 

是的,这是允许的。字段和变量在内存中是不同的空间,在代码中具有相同的标识符。在我看来,这是不应该被允许的,任何人都不应该这样做。是的,只是碰巧这是被允许的。字段和变量在内存中是不同的空间,在代码中具有相同的标识符。在我看来,这是不允许的,任何人都不应该这样做。