Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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_Class_Scope - Fatal编程技术网

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

Java 如何从同一类中的方法引用变量,java,class,scope,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是一个局部变量

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

我有一个简单的语法

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中的经验,我添加了
这个

public class OMG{
    public static void main(String args[]){
        int hi=2;
        letsDoIt();
        System.out.println(hi);
    }
    public static void letsDoIt(){
        this.hi+=1;
    }
}
当无法从静态方法访问非静态变量时,这会增加额外的错误

我在hi中添加了
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
(一些人建议这样回答)替换静态,但错误相同


我的错在哪里?有没有什么方法可以解决这个问题,而不用创建全局类?

静态变量是类的变量,而不是它的实例。方法中不能有静态变量

要修复此错误,请将
hi
移到main方法之外(保持其静态)。还可以在
letsDoIt()
中去掉
this


有两个因素导致您的问题

  • 变量
    hi
    必须在
    main
    方法和
    letsDoIt
    方法之间的共享上下文中引用
  • 由于您的
    main
    方法是
    static
    ,因此您的
    letsDoIt
    ,将只在
    static
    字段上可见(除非将实例作为参数传递,即)
因此:

  • hi
    声明为
    OMG
    static
    字段:

    public class OMG {
        static int hi;
        ...
    
  • 删除
    main
    方法中的局部变量声明

  • OMG.hi
    引用它,或者在
    static
    上下文中用
    hi
    引用它,而不是
    this.hi
    ,因为
    this
    意味着
    Main
    的实例,它在
    static
    上下文中不可见


不能在方法内声明
静态
变量,因为
静态
修饰符表示方法或字段属于类

这个问题最简单的解决方案是将变量声明为
静态
类变量。使用这种方法,您还需要从
lesdoit
方法中的
this.hi
中删除
this
。代码如下所示:

public class OMG {
    static int hi=2;
    public static void main(String args[]) {
        letsDoIt();
        System.out.println(hi);
    }
    public static void letsDoIt() {
        hi+=1;
    }
}
另一种解决方案可能是使用非
静态
变量
hi
。这还需要您删除
letsDoIt
方法的
static
修饰符,以访问
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;
    }
}
更多信息:

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

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;
        }
    }

必须将
static int hi=2
main
方法主体之外。您应该从阅读java教程开始,而不是将其语法建立在其他语言的基础上。我建议您阅读java的概念。另见。然后,您可能想了解将关键字
static
应用于方法时意味着什么。@SotiriosDelimanolis不幸的是,我找不到一个java教程来介绍这一点。我身边有一本Java书,但没有关于“这个”的内容,所以我暗中试探了一下。你找不到一本书或教程涵盖了
this
static
?我不明白为什么你在另一个问题中对Java上的
static
关键字给出了更好的解释,但不在这里……同时删除
letsDoIt
method@LuiggiMendoza我不明白。我回答了另一个问题?你知道哪一个吗?@LuiggiMendoza不,你不知道。因为
这个
指的是疯狂,在
静态
上下文中根本没有实例。它不会编译。@反斜杠哦,对了,我忘了方法是
静态的
,愚蠢的我:)。
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;
        }
    }