如何生成第一行输出?

时间:2016-05-19 20:25:40

标签: java

以下代码出现在过去的一篇文章中,有多处错误(我已经发现并轻易修复)但我很难理解的是输出。

课程:

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;和这两个问题的结果彼此都是独一无二的,所以准确的答案会有所帮助。感谢。

4 个答案:

答案 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()方法。