java对象 - 公共与静态行为

时间:2013-12-02 15:22:27

标签: java arrays class oop object

我有两种方法都打印数组上的内容,一种声明为public void,另一种声明为static void。但是,当我从主程序类调用这些方法时,它们表现出不同的行为。

public void:

  public void listStudent() {
    for (int i = 0;i < 10;i++) {
      if (studentNamesArray[i] != null) {
        System.out.println(studentNamesArray[i]);
        for(int y = 0;y < 3;y++) {
          System.out.println(studentMarksArray[i][y]);
        }
      }
    }
  }

静态无效:

  static void printArrays() {
    for (int i = 0;i < 10;i++) {
      if (studentNamesArray[i] != null) {
        System.out.println(studentNamesArray[i]);
        for(int y = 0;y < 3;y++) {
          System.out.println(studentMarksArray[i][y]);
        }
      }
    }
  }

调用public void会导致nullPointerEception错误,而static void调用不会打印任何内容(如预期的那样)。在这两种情况下,数组都是空的,但是如果我存储一个值然后删除该值,那么public void方法就会按预期打印任何内容。即public void,如果在创建对象之前调用它,则只会导致错误,即使该对象随后立即从数组中删除。

为什么这些方法的行为方式不同?声明方法static void

被认为是不好的做法

1 个答案:

答案 0 :(得分:2)

检查您如何调用该方法。 对于非静态的公共方法,必须初始化对象。

举个例如这样的课程:

public class CustomObject
{
  private static String[][] studentNamesArray = null;

  public void listStudents() {...}
  public static void printArrays() {...}
}

如果你打这个电话:

CustomObject.printArrays();

调用可以工作(并且不打印),因为该方法是静态的,因此在引用该CustomObject时总是存在。

如果你打这个电话:

CustomObject co;
co.listStudents();

它会因空指针异常而失败,因为CustomObject“co”尚未初始化。无法对null对象进行方法调用。

此外,必须初始化数组。如果没有周围的代码,很难说出程序中发生了什么,但是调用:

if( studentNamesArray[i] == null )
如果数组未初始化,

将生成NPE。找不到空数组的第[i]个实例。对于方法的静态版本和本地版本都是如此。