我不明白为什么Java中的数组上的方法必须是静态的。静态方法只能用于静态变量吗?那么这意味着数组是静态变量,类是由类共享的吗?但这会是什么课?
有人能帮我理解吗?
编辑:更具体一点,我正在创建处理数组的方法,但如果我只是写" public int [] expandArr(int [] a,int v)"我试着在main方法中使用这个方法,我得到一个错误,说我不能对非静态方法进行静态引用。当我写" public static int [] expandArr(int [] a,int v)"它起作用了。
我知道你无法改变数组的大小,我编写的方法会生成一个大小增加的新数组,并将第一个数据复制到其中。
谢谢。
答案 0 :(得分:2)
你说你试过写这个:
public int[] expandArr(int[]a, int v)
问题是,您必须在某些类中编写它,因为您不能在程序中使用自由浮动方法。因此,它必须在类的实例上运行。例如:
public class MyProgram {
public int[] expandArr(int[]a, int v) { ... }
public static void main(String[] args) { ... }
}
expandArr
需要MyProgram
的实例,因为您没有将其声明为static
。这与数组无关。如果你写了
public class MyProgram {
public String expandString(String s, int v) { ... }
public static void main(String[] args) {
String s = expandString(args[0], 1); // ILLEGAL
String s2 = args[0].expandString(1); // ILLEGAL
}
}
虽然expandString
的第一个参数是String
,但这实际上是在MyProgram
上运行,如果没有expandString
的实例,则无法使用MyProgram
操作。设为static
意味着您可以(在我的示例中首次使用expandString
将变得合法。)
通常,您无法在不修改该类源的情况下向类添加方法。如果你想编写一个对某个类C
的对象做某事的新方法,你就不能修改类C
(也许是因为它在Java库中或者其他人的图书馆),那么您需要将该方法放在其他课程C2
中,大多数情况下您需要制作方法static
,因为它不是&{ #39; t涉及班级C2
的对象。
答案 1 :(得分:1)
除非您首先实例化类的对象,否则无法从静态方法调用非静态方法。
e.g。
在课堂上随便......
public boolean ok() {
return true;
}
public static void main(String[] args) {
Whatever w = new Whatever();
System.out.println(w.ok());
}
答案 2 :(得分:1)
您无法从静态上下文中调用非静态方法。静态方法属于类,非静态或实例方法被复制到类的每个实例(它们各自都有自己的)。如果我有10个类A的实例,并且类A有一个静态方法,它们都共享,那么我尝试从类A的静态方法调用类A中的非静态方法,类A的实例调用其方法?行为未定义。
问题实际上与数组无关。
这个问题是相关的:Can't call non static method
答案 3 :(得分:0)
我认为您所指的是您无法扩展数组类,因此无法向其添加方法:
// No way to do this
int[] array;
array.myMethod();
这意味着您唯一的选择是在某处创建一个静态帮助器方法:
// So you have to do this
int[] array;
Utils.myMethod(array);
class Utils {
static void myMethod(int[] array) {
...
}
}
这方面的一个例子是Arrays
类,它有许多用于在数组上操作的静态方法。从概念上讲,如果将这些方法添加到数组类中会更清楚,但是你不能在Java中这样做(你可以在其他语言中使用Javascript)。
答案 4 :(得分:0)
这就是为什么我们使用像ArrayList这样的其他类来使它们动态增长。在arraylist的核心,你只需找到一个数组,只要课程有必要,它就会更新。如果我正确理解你的问题。