2016-05-19 16 views
-1

次のコードは過去の論文に複数の間違いがありましたが(私はそれを簡単に見つけて修正しましたが)、理解するのに苦労しているのは出力です。出力の最初の行はどのように生成されますか?

クラス:

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 
[email protected] 
[] 

誰かがコードを参照して出力を説明することができれば、私は感謝します。

サイドノート:出力の最初の行は私を困惑させるものです。他のビット私は理解しています。 最後の注記:これは出力に関する固有の質問です。どのような質問でも重複しているわけではありません(私の知る限りでは、「可能な重複」へのリンクは「この出力はどのように生成されますか」ではなく、メソッドのオーバーロードに関するもので、両方の質問の結果は互いにユニークです)正確な答えが役に立つでしょう。ありがとう。

+0

最初の行は、あなたが数えた別のものの番号を印刷しているだけです。 4つの要素を持つ 'Object'の配列をコンストラクタに渡すので、' o'は '4'です。 – azurefrog

+0

最初の行は 'Count'の' toString() 'メソッドであり、' Count'の特定のメソッドが何回呼び出されたかを示しています。 'c'は' count(Collection) 'が呼び出された回数で、' l'は 'count(List)'が呼び出された回数などです。 – FriedSaucePots

+1

あなたは出力について混乱していますか? '1/0、0/1、1、1、1'ではなく' 0、0、0、4、0'ですか?もしそうなら、@ Tomが投稿したように、これは答えられました。 – Ironcache

答えて

2
for(int j=0; j<objects.length; j++){ 
      count(objects[j]); 
     } 

あなたは、カウント(オブジェクト[J])呼び出すときに渡している引数がオブジェクトであるため、

public void count(Object x){o++;}のみ

に対応しています。オブジェクトをパラメータとして持つcount関数を呼び出しています。これがJavaがあなたのためにやっていることです。

オブジェクト[]内のオブジェクトの数は4です。したがって、count(Object x)は4回呼び出されます。あなたは、O以外のすべての変数に対して0を参照してください理由です

他の整数に関しては、それらは0にデフォルトで初期化されに、そしてそれゆえ、あなたは0

を参照してください。あなたの問題の

2
public Count(Object[] objects){ 
     for(int j=0; j<objects.length; j++){ 
      count(objects[j]); 
     } 

これらの行では、各要素がObject型(それは他のすべてのクラスが継承するクラス)の要素の配列を作成しています。したがって、Object型のオブジェクトを配列に出力することは驚くべきことではありません。 (カウントはあなたが数える関数を呼び出すときに選択された1パラメータが選ばれるように、オブジェクトタイプに数え、そのため。最も適したタイプを持っている必要があります。overloaded methodsによって保持されている。)

0, 0, 0, 4, 0 

次に、あなたがしていますオブジェクトの新しい配列を作成し、配列の各要素を異なる型で初期化します。

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型の文字列として出力され、オブジェクト自体はその内部の"name"(これはObject型の各オブジェクトのフィールドである方法で)を印刷するよりも賢明なtoString()メソッドを持たず、もちろん空のリンクリスト[]以上です。

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. 
[email protected] // memory address of where Object is 
[] // initialized to empty list [] 
0

Countクラスのすべてが1つのパラメータのみを受け入れ、カウント変数が静的でないため、これらのうち4つは常にゼロになります。

次の4行は、静的オブジェクト配列内の4つのオブジェクトを出力します。これは事実上、各オブジェクトの結果をSrting()メソッドに出力するだけです。

関連する問題