简单的代码,计算给定数组中的数字n,但是我收到一个错误,告诉我将instancevariable更改为static。
public class Test{
int []arr = {4, 21, 4};
Counter c = new Counter();
public static void main(String[] args) {
System.out.println(c.counter(4, arr));
}
}
public class Counter {
public int counter(int n, int []ar){ //tried to change method to static - didn't help
int counter = 0;
for(int i = 0; i < ar.length; i++){
if(n == ar[i]){
counter++;
}
}
return counter;
}
}
错误显示在第7行:将int [] arr
和Counter c
更改为静态。
试图使计数器方法保持静态,但它仍然告诉我将我的数组更改为静态。原因是什么?
答案 0 :(得分:1)
你是指静态函数内部的两个变量,它们本身需要是静态的,以避免错误。
静态方法是可以在没有类的对象的情况下调用的方法。这意味着没有this
引用,也没有分配给访问的实例变量。相反,静态变量在加载类时分配,并且可用于静态和非静态方法。
在yout代码中,问题是您尝试从main
方法内部访问变量,该方法始终是静态的。
答案 1 :(得分:1)
main
方法是在静态上下文中,不是吗?在Test
中声明的数组和计数器不是静态的。
您永远不能直接访问静态上下文中的非静态成员。
这就是为什么IDE建议您将字段设置为静态。
将counter
方法更改为静态并不能真正解决问题,因为您仍在尝试在静态上下文中直接访问arr
。
解决此问题的另一种方法是同时生成c
和arr
个局部变量:
public static void main(String[] args) {
int []arr = {4, 21, 4};
Counter c = new Counter();
System.out.println(c.counter(4, arr));
}
答案 2 :(得分:0)
程序的主要方法不能绑定到类的实例,因此它被定义为静态。
arr
和c
被声明为Test
的实例变量,因此它们是该类的每个实例的成员。 main
方法范围内不存在此类实例。
静态方法中使用的任何标识符必须是以下之一: a)同一类的静态成员 b)在方法中声明的局部变量 c)在全局命名空间中(例如,另一个类的静态成员,如Math.pi)
最简单的解决方案是简单地在主方法中移动arr
和c
的定义。根据您的使用情况,他们没有理由成为班级成员。
public class Test{
public static void main(String[] args) {
int []arr = {4, 21, 4};
Counter c = new Counter();
System.out.println(c.counter(4, arr));
}
}
如果您需要他们成为班级成员,您只需更改原始代码即可使其成为静态代码(即static int []arr = {4, 21, 4};
)
更灵活的解决方案可能涉及使用命令行参数来指定值,或者如果要使用实例变量,则在main方法中实例化类:
public class Test{
int []arr = {4, 21, 4};
Counter c = new Counter();
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.c.counter(4, t.arr));
}
}
但是^这有点粗糙。