Что это за часть кода - PullRequest
1 голос
/ 25 мая 2011

У меня есть некоторый код, который демонстрирует использование потоков с помощью интерфейса Runnable.Я начал с кода где-то на сайте и изменил его по своему вкусу.Это работает, но я не понимаю часть этого.Я пытался урезать код до сути того, что я спрашиваю, но я, возможно, вынул слишком много.Код, который у меня есть в 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();
    }

}

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Каждый класс реализует toString( ), потому что он определяется Object.Однако реализации по умолчанию toString( ) редко бывает достаточно.

Для большинства важных классов, которые вы создаете, вы захотите переопределить toString( ) и предоставить свои собственные строковые представления.К счастью, это легко сделать.Метод toString( ) имеет следующую общую форму:

String toString( )   

Метод toString() объекта вызывается автоматически, когда ссылка на объект передается в методе System.out.println().


@Override служит документацией для читателя и двойной проверкой в ​​компиляторе.Используйте аннотацию @Override, чтобы указать, что метод переопределяет другой в базовом классе.

Например,

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

См .: Когда вы используете аннотацию @Override Java ипочему?

1 голос
/ 25 мая 2011

Ладно, дело в том, что вы переопределяете метод Object.toString(), который всегда возвращает некоторое строковое представление именованного класса. Все, что он делает, это составляет строку типа

"Thread XXX: 5"

В Java вы всегда можете переопределить методы родительских классов (не финальные); тег @Override просто полезный совет для инструментов. Но он не устанавливает имя чего-либо: он создает новую анонимную строку и возвращает ее ссылку.

Если бы вы позвонили по стандартному toString() на Thread, вы получили бы строку типа «<#Thread 2348564>» или что-то такое же полезное; теперь для этого класса вы получаете полезную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...