Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法打印出b.toString和c.toString_Java_Arrays_Tostring - Fatal编程技术网

Java 无法打印出b.toString和c.toString

Java 无法打印出b.toString和c.toString,java,arrays,tostring,Java,Arrays,Tostring,该程序的目的是教我如何创建字符列表,并练习使用toString和booleanequals(object-other) 我的输出是: a:katnis,有6个角色 b:而且有0个字符 c是:并且有0个字符 main功能是由我的讲师为我提供的。我不明白为什么它没有打印出“蝙蝠侠”。2件事需要检查(加上第0件事): 0) 您需要有一个getArray()函数。因为数组被标记为私有,所以无法从外部访问它。您可以编写other.Array,但因为Array是私有的,所以最好使用getArray函数。添加

该程序的目的是教我如何创建字符列表,并练习使用
toString
booleanequals(object-other)

我的输出是: a:katnis,有6个角色 b:而且有0个字符 c是:并且有0个字符
main
功能是由我的讲师为我提供的。我不明白为什么它没有打印出“蝙蝠侠”。

2件事需要检查(加上第0件事):

0)

您需要有一个getArray()函数。因为数组被标记为私有,所以无法从外部访问它。您可以编写other.Array,但因为Array是私有的,所以最好使用getArray函数。添加getArray()是一个不错的选择。(它很简单,看起来像:
getArray(){returnthis.Array;}

1)

您编写的构造函数如下所示:

public CharList(){
}
公共列表(其他列表){
other.Array=新字符[100];
}
这是错误的。 您应该这样更改这些内容:

public CharList(){
this.Array=新字符[100];
}
公共列表(其他列表){
this.Array=other.Array;
}
在这里,我们将空构造函数初始化为设置字符长度100。对于另一个,我们使用other.getArray()使this.Array=other.Array。 现在,如果你尝试这个,它应该会起作用

2) 假设你有这个:

CharList蝙蝠侠1=新的CharList(“蝙蝠侠”);
CharList蝙蝠侠2=新的CharList(“蝙蝠侠”);
然后,
javabatman1.equals(batman2)
将返回false。这是因为java中的指针以及变量赋值的工作方式。要使batman1.Array等于batman2.Array,仅使其值相等是不够的。他们也必须指向同一个东西。有关更多信息,请参阅

要解决此问题,我们需要一个getArray()。假设我们有:

公共布尔等于(对象其他){
如果(其他==null){
返回false;
}
如果(!(CharList的其他实例)){
返回false;
}
如果(other.size()!=this.size()){
返回false;
}
CharList that=(CharList)other;

对于(inti=0;i而言,问题在于您的构造函数采用了字符表

public CharList(CharList other){
    other.Array=new char[100];
}
您可以看到,它正在将other.Array设置为一个大小为100的新数组

所以当你这么做的时候

CharList c = new CharList(b);
您正在将b的数组设置为一个新数组,以清除包含“蝙蝠侠”中字符的数组

如果您将有问题的构造函数修复为

Array = other.Array.clone()
这会解决问题。我克隆了另一个数组,这样b和c就不会指向完全相同的数组。如果在向一个数组添加字符时它们指向同一个数组,那么它也会向另一个数组添加字符

接下来,您将看到
size()的问题
method。它返回
numElements
,但
numElements
未在接受字符串或字符表的构造函数中设置,因此它始终为0。因此,请确保在这些构造函数中设置
numElements
。由于此错误,您将看到在调用
add
初始化为Stri的字符表时ng它更改第一个字符,而不是将其添加到末尾

我只回答了关于蝙蝠侠和大小的问题。但是这段代码还有其他几个问题

  • 如果有人对使用默认构造函数初始化的字符列表调用add超过100次,会发生什么情况
  • equals
    方法是执行引用相等性检查,而不是确保数组中的字符相同
  • 当您调用
    add
    到用字符串或字符列表实例化的字符列表时会发生什么?正如我所指出的,它当前会更改索引0处的字符。但即使您解决了这个问题并正确设置
    numElements
    会发生什么?它将尝试写入
    数组的末尾

  • 一个类被允许访问它自己的私有成员。所以其他.Array是可以访问的。好的,谢谢你让我知道。我想这是有道理的,我以前做过,但是使用getArray函数还是一个好的做法(在equals检查器之外)。添加
    getArray
    将彻底破坏封装。如果没有很好的理由,请不要公开您的私有实现详细信息。因为如果添加
    getArray
    则数组是可变的,任何人都可以通过修改返回的数组来修改CharList的实例。因此,在我的回答中,为什么我要克隆其他。ArrayYou缺少分号n在“打印c”这一行,代码不会编译讲师只希望我有100个数组,我在构造函数中添加了这个.numElements=Array.length;,但我仍然对size()有问题,因为c是蝙蝠侠,所以它仍然打印出0。
    CharList c = new CharList(b);
    
    Array = other.Array.clone()