1

Runnable インターフェイスを使用してスレッドを使用する方法を示すコードがいくつかあります。どこかの Web サイトのコードから始めて、自分の好みに合わせて変更しました。それは動作しますが、私はその一部を理解していません。求めていることの本質までコードを削除しようとしましたが、取りすぎた可能性があります。私が NetBeans に持っているコードは機能するので、間違ったものを取り除いて台無しにしない限り、これは機能するコードです。しかし、私の質問をさせてください、そしてそれが関係なく答えられるかどうか見てみましょう:私が理解できない部分はこの部分です:

public String toString()
       {
return "Thread " + Thread.currentThread().getName() + ": " + countDown;
       }

長い間、これは、実行時に現在のスレッドの名前と同じ名前に動的に設定されるメンバー変数のように見えました。しかし、Java では変数に動的に名前を付けることができないということも複数の場所で読んだので、それは私が見ているものではないと思います。次に、何かがオーバーライドされているため、NetBeans がこのコードセクションの直前に @Override を配置することを望んでいることに気付きました。しかし、何がオーバーライドされているのか正確にはわかりません。親クラスのコンストラクターをオーバーライドしていますか? もしそうなら、どのクラスですか?

とにかく、ここにコードがあります:

package countdown;

public class Counter implements Runnable
{
private int countDown = 5;
public String toString()
       {
return "Thread " + Thread.currentThread().getName() + ": " + countDown;
       }


public void run()
    {
   while(true) {
  System.out.println(this);
  if(--countDown == 0)
                      {
return;
                      }
                }
    }
}
package countdown;

public class Main 
{

public static void main(String[] args)
    {
for(int i = 1; i <= 5; i++)
  new Thread(new Counter(), "" + i).start();
    }

}
4

2 に答える 2

1

わかりました。メソッドをオーバーライドしているということです。このObject.toString()メソッドは、常に名前付きクラスの文字列表現を返します。それがしているのは、次のような文字列を構成することだけです

"Thread XXX: 5"

Java では、親クラス (非最終) メソッドをいつでもオーバーライドできます。タグは、@Overrideツールのヒントとして役立ちます。しかし、何かの名前を設定しているわけではありません。新しい匿名の文字列を作成し、その参照を返します。

standard toString()onを呼び出すとThread、"<#Thread 2348564>" のような文字列、またはそれと同等の有用な文字列が得られます。さて、このクラスでは、有用な情報が得られます。

于 2011-05-25T06:14:04.807 に答える
1

toString( )によって定義されるため、すべてのクラスが実装されObjectます。ただし、 のデフォルトの実装でtoString( )十分な場合はほとんどありません。

toString( )作成する最も重要なクラスでは、独自の文字列表現をオーバーライドして提供する必要があります。幸いなことに、これは簡単に行うことができます。toString( )メソッド の一般的な形式は次のとおりです。

String toString( )   

toString()オブジェクト参照がメソッドに渡されると、オブジェクトのメソッドが自動的に呼び出されますSystem.out.println()


@Override読者のためのドキュメントとして、またコンパイラでの二重チェックとして機能します。@Override注釈を使用して、メソッドが基本クラスで別のメソッドをオーバーライドしていることを示します。

例えば

@Override
public String toString()
       {
return "Thread " + Thread.currentThread().getName() + ": " + countDown;
       }

参照: Java の @Override アノテーションをいつ使用し、その理由は?

于 2011-05-25T06:16:08.707 に答える