为什么我需要在这里使用 class- 而不是 instancevariable?
Why do I need to use class- instead of instancevariable here?
简单的代码,计算给定数组中的数字 n,但我收到一个错误,告诉我将我的实例变量更改为静态。
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
更改为静态。
试图将计数器方法设为静态,但它仍然告诉我将数组更改为静态。什么原因?
您是从静态函数内部引用这两个变量,它们本身需要是静态的以避免错误。
静态方法是一种无需 class 的对象即可调用的方法。这意味着没有 this
引用,也没有分配给访问的实例变量。相反,静态变量是在加载 class 时分配的,并且可用于静态和非静态方法。
在您的代码中,问题是您尝试从 main
方法内部访问变量,该方法始终是静态的。
main
方法是在静态上下文中,不是吗?您在 Test
中声明的数组和计数器不是静态的。
You can never directly access non-static members in a static context.
这就是 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));
}
程序的 main 方法不能绑定到 class 的实例,因此它被定义为静态的。
arr
和 c
被声明为 Test
的 实例变量 ,因此它们是 [=36] 的每个实例的成员=]. main
方法的范围内不存在这样的实例。
静态方法中使用的任何标识符必须是以下之一:
a) 相同 class 的静态成员
b) 在方法内声明的局部变量
c) 在全局命名空间中(例如另一个 class 的静态成员,如 Math.pi)
最简单的解决方案是简单地将 arr
和 c
的定义移动到 main 方法中。鉴于您的使用情况,他们没有理由成为 class 的成员。
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));
}
}
如果您需要它们成为 class 的成员,您只需更改原始代码,使它们成为静态的(即 static int []arr = {4, 21, 4};
)
更灵活的解决方案可能涉及使用命令行参数来指定值,或者如果您想使用实例变量,则在 main 方法中实例化 class:
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));
}
}
但是^这有点恶心。
简单的代码,计算给定数组中的数字 n,但我收到一个错误,告诉我将我的实例变量更改为静态。
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
更改为静态。
试图将计数器方法设为静态,但它仍然告诉我将数组更改为静态。什么原因?
您是从静态函数内部引用这两个变量,它们本身需要是静态的以避免错误。
静态方法是一种无需 class 的对象即可调用的方法。这意味着没有 this
引用,也没有分配给访问的实例变量。相反,静态变量是在加载 class 时分配的,并且可用于静态和非静态方法。
在您的代码中,问题是您尝试从 main
方法内部访问变量,该方法始终是静态的。
main
方法是在静态上下文中,不是吗?您在 Test
中声明的数组和计数器不是静态的。
You can never directly access non-static members in a static context.
这就是 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));
}
程序的 main 方法不能绑定到 class 的实例,因此它被定义为静态的。
arr
和 c
被声明为 Test
的 实例变量 ,因此它们是 [=36] 的每个实例的成员=]. main
方法的范围内不存在这样的实例。
静态方法中使用的任何标识符必须是以下之一: a) 相同 class 的静态成员 b) 在方法内声明的局部变量 c) 在全局命名空间中(例如另一个 class 的静态成员,如 Math.pi)
最简单的解决方案是简单地将 arr
和 c
的定义移动到 main 方法中。鉴于您的使用情况,他们没有理由成为 class 的成员。
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));
}
}
如果您需要它们成为 class 的成员,您只需更改原始代码,使它们成为静态的(即 static int []arr = {4, 21, 4};
)
更灵活的解决方案可能涉及使用命令行参数来指定值,或者如果您想使用实例变量,则在 main 方法中实例化 class:
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));
}
}
但是^这有点恶心。