我在使用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;
}
}*/
答案 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"
}
}
这里x
和y
的值是引用到同一个数组对象...所以如果更改数组&#34;通过&#34; x
,该更改仍以y[0]
显示。
如果您想让代码创建独立的对象,您需要更改此内容:
public ObjectTest(String j[]){
namesrt = j;
}
为:
public ObjectTest(String j[]){
namesrt = j.clone();
}
(理想情况下更改它以将参数声明为String[] j
,或者更好地修改所有变量名称以使其更有意义,但这是另一回事。)