以下代码出现在过去的一篇文章中,有多处错误(我已经发现并轻易修复)但我很难理解的是输出。
课程:
import java.util.*;
class Count {
int i, s, o, l, c;
public Count(Object[] objects){
for(int j=0; j<objects.length; j++){
count(objects[j]);
}
}
public void count(Collection x){c++;}
public void count(List x){l++;}
public void count(Double x){i++;}
public void count(Object x){o++;}
public void count(String x){s++;}
public String toString(){
return c + ", " + l + ", " + i + ", " + o + ", " + s;
}
}
import java.util.LinkedList;
public class Test {
static Object[] objects = {new Double(10), new String("Q1"),
new Object(), new LinkedList()};
public static void main(String args[]){
System.out.println(new Count(objects));
for(Object o : objects)
System.out.println(o);
}
}
生成输出:
0, 0, 0, 4, 0
10.0
Q1
java.lang.Object@6d06d69c
[]
如果有人可以参考代码解释输出,我会很感激。
旁注:输出的第一行是困扰我的。我理解的另一点。 最后一点:这是一个关于输出的独特问题。这不是任何问题的重复(据我所知 - 链接到&#39;可能重复&#39;关于方法重载不是&#34;这个输出是如何产生的?&#34;和这两个问题的结果彼此都是独一无二的,所以准确的答案会有所帮助。感谢。
答案 0 :(得分:2)
public Count(Object[] objects){
for(int j=0; j<objects.length; j++){
count(objects[j]);
}
在这些行中,您将创建一个元素数组,其中每个元素都是Object本身的类型(它是每个其他类继承的类)。因此,数组中Object类型的计数对象的输出不应该是一个惊喜。 (计数由overloaded methods保持。当您调用计数函数时,所选择的函数必须具有最合适的类型。因此,选择使用对象类型作为参数进行计数。)
0, 0, 0, 4, 0
接下来,您将创建新的Objects数组,使用不同的类型初始化数组的每个元素。
static Object[] objects = {new Double(10), new String("Q1"),
new Object(), new LinkedList()};
这可能是因为upcasting。正如我之前提到的,每个元素都继承自Object类,因此程序中的每个对象实际上都是Object。使用多态性机制,您的程序现在可以“推断”数组中元素的实际类型。也就是说,你可以在这里看到它
for(Object o : objects)
System.out.println(o);
Java正在打印动态获取的信息。因此,double被打印为double,string被打印为string,对象本身没有比打印其内部"name"更合理的toString()方法(顺便说一下,这是Object类型的每个对象所具有的字段)和当然空链接列表不超过[]。
答案 1 :(得分:2)
for(int j=0; j<objects.length; j++){
count(objects[j]);
}
对应
仅 public void count(Object x){o++;}
因为你在调用count(objects [j])时传递的参数是一个对象。您正在调用一个具有对象作为参数的计数函数,这就是Java正在为您做的事情。
对象[]中的对象数为4.因此,count(对象x)被调用4次。
关于其他整数,它们默认初始化为0,因此你看到0。
这就是除了o之外所有变量都看到0的原因。
答案 2 :(得分:1)
你的一个问题在于:
public void count(Collection x){c++;} // never called, init to 0
public void count(List x){l++;} // never called, init to 0
public void count(Double x){i++;} // never called, init to 0
public void count(Object x){o++;} // called 4 times, result is 4
public void count(String x){s++;} // never called, init to 0
你永远不会初始化任何变量(c,k,i,o,s)所以我相信int类型是自动初始化为0.然后下次调用它时它会递增。最终结果是:
0, 0, 0, 4, 0 //
现在休息:
10.0 // 10.0 because that was value specified when Double was created
Q1 // Q1 because that was the String value when it was created.
java.lang.Object@6d06d69c // memory address of where Object is
[] // initialized to empty list []
答案 3 :(得分:0)
第一行输出在Test类的main方法中传递给Count实例的构造函数的Collections,Lists,Doubles,Objects,Strings的数量,因为所有Count类只接受一个参数和计数变量不是静态的,其中四个总是为零。
接下来的四行打印静态对象数组中的四个对象。这实际上只是将每个对象的结果打印到Srting()方法。