为什么数组上的方法必须是静态的(Java)?

时间:2014-04-22 18:43:57

标签: java static

我不明白为什么Java中的数组上的方法必须是静态的。静态方法只能用于静态变量吗?那么这意味着数组是静态变量,类是由类共享的吗?但这会是什么课?

有人能帮我理解吗?

编辑:更具体一点,我正在创建处理数组的方法,但如果我只是写" public int [] expandArr(int [] a,int v)"我试着在main方法中使用这个方法,我得到一个错误,说我不能对非静态方法进行静态引用。当我写" public static int [] expandArr(int [] a,int v)"它起作用了。

我知道你无法改变数组的大小,我编写的方法会生成一个大小增加的新数组,并将第一个数据复制到其中。

谢谢。

5 个答案:

答案 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的核心,你只需找到一个数组,只要课程有必要,它就会更新。如果我正确理解你的问题。