臭名昭着的对象bug

时间:2014-06-06 16:46:22

标签: java

我在使用netbeans时发现了我认为的错误。当我调用我的方法按字母顺序对包含名称(ob.sort)的数组进行排序时,它会自动排序另一个包含原始名称的数组,因为原始名称不会分配给它之后的任何内容。已在开头填充输入(ob.input)。 我在编写更大的程序时遇到了这个问题(遇到过不止一次),但我做了一个更简单的程序来证明这个问题。看起来就像我复制了类方法一样,它粘贴在主类下面,这样你就可以更容易地跟踪程序中的变量。

public static void main(String args[]){
    ObjectTest ob = new ObjectTest();
    ob.input();
    String x[] = ob.getNames();
    System.out.println(x[0]);
    ob = new ObjectTest(x);
    System.out.println(x[0]);
    ob.sort();
    System.out.println(x[0]);
    String y[] = ob.getNamesrt();
    System.out.println(x[0]);

}
}
    /*import java.io.*;
import javax.swing.*;
public class ObjectTest {
String name[];
String namesrt[];

public ObjectTest(){
    name = new String[3];
    namesrt = new String[3];
}

public ObjectTest(String j[]){
    namesrt = j;
}

public void input(){
    for(int i = 0; i < name.length; i++){
        name[i] = JOptionPane.showInputDialog("Enter name");
    }
}

public void sort(){
    if(!(namesrt == null)){
    for(int i = 0; i < namesrt.length; i++){
        for(int c = i + 1; c < namesrt.length; c++){
            if(namesrt[i].compareToIgnoreCase(namesrt[c]) > 0){
                String n = namesrt[i];
                namesrt[i] = namesrt[c];
                namesrt[c] = n;
            }
        }
    }
    }
    else{JOptionPane.showMessageDialog(null,"Names not received");}
}

public String[] getNames(){
    return name;
}

public String[] getNamesrt(){
    return namesrt;
}

public void setNames(String j[]){
    name = j;
}

public void setNamesrt(String j[]){
      namesrt = j;
}
}*/

1 个答案:

答案 0 :(得分:8)

  

我在使用netbeans时发现了我认为的错误。

嗯,这可能是您代码中的错误。它不是Java或Netbeans中的错误。它只是证明了数组是Java中的引用类型以及对象的工作方式这一事实。

这是一个简短而完整的计划,展示了同样的效果:

public class Test {
    public static void main(String[] args) {
        String[] x = { "hello" };
        // Copy the *reference*
        String[] y = x;
        System.out.println(y[0]); // Prints "hello"
        x[0] = "new value";
        System.out.println(y[0]); // Prints "new value"
    }
}

这里xy的值是引用到同一个数组对象...所以如果更改数组&#34;通过&#34; x,该更改仍以y[0]显示。

如果您想让代码创建独立的对象,您需要更改此内容:

public ObjectTest(String j[]){
    namesrt = j;
}

为:

public ObjectTest(String j[]){
    namesrt = j.clone();
}

(理想情况下更改它以将参数声明为String[] j,或者更好地修改所有变量名称以使其更有意义,但这是另一回事。)