如何从同一类中的方法引用变量

时间:2014-06-18 14:59:00

标签: java class scope

我惊讶地发现这令人困惑。我一定错过了什么。

所以我有这个简单的语法

public class OMG{
    public static void main(String args[]){
        int hi=2;
        letsDoIt();
        System.out.println(hi);
    }
    public static void letsDoIt(){
        hi+=1;
    }
}

显然这会导致错误,因为hi是一个局部变量。

根据我从python的经验判断,我添加了this

public class OMG{
    public static void main(String args[]){
        int hi=2;
        letsDoIt();
        System.out.println(hi);
    }
    public static void letsDoIt(){
        this.hi+=1;
    }
}

当无法从静态方法访问非静态变量时会增加额外的错误。

我将 static 添加到了

public class OMG{
    public static void main(String args[]){
        static int hi=2;
        letsDoIt();
        System.out.println(hi);
    }
    public static void letsDoIt(){
        this.hi+=1;
    }
}

编译器骂我非法表达。我用private代替静态(有些SO答案,推荐)但是同样的错误。

我的错误在哪里?有没有什么办法可以解决这个问题,而没有进行全球化的分类?

4 个答案:

答案 0 :(得分:3)

您无法在方法中声明static变量,因为static修饰符表示方法或字段属于该类。

解决此问题的最简单方法是将变量声明为static类变量。使用此方法,您还需要在this方法中从this.hi中删除lestDoIt。代码如下:

public class OMG {
    static int hi=2;
    public static void main(String args[]) {
        letsDoIt();
        System.out.println(hi);
    }
    public static void letsDoIt() {
        hi+=1;
    }
}

另一种解决方案可能是使用非static变量hi。这还需要您删除static方法的letsDoIt修饰符才能访问hi字段,因为static方法无法访问实例字段,因为如上所述, static表示方法或字段属于该类,而不属于该类的特定对象实例。

解决方案是:

public class OMG {
    int hi=2;
    public static void main(String args[]) {
        //note that we have to create a new instance of OMG
        //because, again, static methods cannot access to non-static methods/fields
        OMG omg = new OMG();
        omg.letsDoIt();
        System.out.println(omg.hi);
    }
    public void letsDoIt() {
        this.hi+=1;
    }
}

更多信息:

答案 1 :(得分:0)

静态变量是类的变量,而不是其实例。你不能在方法中有一个静态变量。

要修复此错误,请将hi移到main方法之外(保持静态)。还要摆脱this中的letsDoIt()

public class OMG {

    static int hi=2;

    public static void main(String args[]){
        letsDoIt();
        System.out.println(hi);
    }

    public static void letsDoIt() {
        hi+=1;
    }
}

答案 2 :(得分:0)

导致您出现问题的原因有两个。

  • 变量hi必须在main方法与letsDoIt方法
  • 之间的共享上下文中引用
  • 因为您的main方法是static,所以您的letsDoIt只能看到static字段(除非作为参数传递实例,即)

因此:

  • hi声明为static的{​​{1}}字段:

    OMG
  • public class OMG { static int hi; ... 方法中删除本地变量声明。

  • main上下文中使用OMG.hi或仅hi引用它,static作为this.hi引用this隐含Main的实例,该实例在static上下文中不可见

答案 3 :(得分:0)

你不能在静态上下文中执行“this.hi + = 1”,并且为了从“letsDoIt()”访问hi变量,你必须将它声明为类变量,就像我在下面的代码中所做的那样: / p>

public class OMG{
        public static int hi;

        public static void main(String args[]){
            hi=2;
            letsDoIt();
            System.out.println(hi);
        }
        public static void letsDoIt(){
            hi+=1;
        }
    }