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