Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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_Static Methods - Fatal编程技术网

Java 静态方法中的实例变量

Java 静态方法中的实例变量,java,static-methods,Java,Static Methods,我正在准备Java SE 7的OCA认证,在第一章Java基础知识中,我阅读了以下关于静态方法的内容: 静态方法与对象无关,不能使用类的任何实例变量 在下面的示例中,编译器给了我一个错误: class MyClass2 { String a; public MyClass2() { } static void check(){ if (a.equals("TEST")) return; } } 无法对非静

我正在准备Java SE 7的OCA认证,在第一章Java基础知识中,我阅读了以下关于静态方法的内容:

静态方法与对象无关,不能使用类的任何实例变量

在下面的示例中,编译器给了我一个错误:

class MyClass2 {

    String a;

    public MyClass2() {

    }

    static void check(){
        if (a.equals("TEST"))
            return; 
    }
}
无法对非静态字段a进行静态引用

如果以这种方式更改类定义:

class MyClass {

    String a;

    public MyClass() {
        // TODO Auto-generated constructor stub
        check(a);
    }

    static void check(String a){
            if (a.equals("TEST"))
                return; 
    }
}

一切正常,编译器没有显示任何错误,这很奇怪,因为
a
始终是一个实例变量。

在第二个示例中,
check
有一个名为
a
的参数。相等性检查是针对它执行的,而不是针对实例成员
a
,该实例成员实际上仍然无法从
静态
上下文访问。

在第一种情况下,编译错误发生时-

  • 您有一个非静态字段
    字符串a
  • 您正试图从静态方法
    check()
这就是发生编译错误的原因

在第二种情况下,在没有发生编译错误的情况下-

  • 您正在从构造函数调用静态方法
    check()
  • 调用类的静态方法而不创建其实例/对象是完全有效的。
    这就是为什么你没有得到任何编译错误
希望对您有所帮助。

非常感谢。

静态方法只能引用静态变量。因为非静态变量不属于类,而是属于实例化的特定对象。。。静态方法无法知道要显示哪些变量。例如,您创建了MyClass的两个实例

MyClass x,y;
x.a =10;
x.b=20;
那个么就并没有办法知道从静态函数中选择哪一个是正确的,因为静态函数和任何特定的实例(x或y)都并没有关联

所以,如果您想访问变量a,您需要将其声明为静态变量

static String a;

但是,在第二种情况下,您有一个as参数,因此当引用该参数代替类级别变量时,不会出现错误。如果希望出错,请使用此.a引用类级变量。

当您将实例变量传递给静态方法(或任何其他方法)时,您将传递该变量的值。而不是变量本身。这可能就是为什么你没有得到错误。
但是,变量本身不可用。

a.equals(“TEST”)
使用方法参数
a
,而不是实例字段(使用相同的变量名称)。构造函数可以将实例字段传递给方法调用,但这对于引用的段落并不重要。在本书第53页,我相信您指的是作者Mala Gupta,他说:“静态方法和静态变量都不能访问类的非静态变量和方法。但事实恰恰相反:非静态变量和方法可以访问静态变量和方法,因为即使不存在类的实例,类的静态成员也存在。“那么,*静态方法不与对象关联,也不能使用类的任何实例变量,这不是真的*好的,我同意调用一个类的静态方法而不创建它的实例/对象是完全有效的,但问题是在这个方法中我传递一个指向stati对象的对象引用,这是我的主要关注点,在上面的程序中,当你调用check(a),参数中有instancevariable,但实际上,假设a=“xyz”,当调用check()方法时,值将被复制到被调用方法“a”的局部变量上,这与实际变量{instance variable}不同,因此您不会遇到任何问题。上面我们已经有了代码,这解释了这个概念。