Справка по домашней задаче Java (доступ к статическому члену с помощью справки об экземпляре)
Вот мой вопрос о домашнем задании:
Напишите объявление класса для класса "Часы". Он должен иметь переменные экземпляра для часов, минут, секунд (все целые числа). Он также должен иметь метод toString() для отображения времени в формате, показанном ниже. Напишите отдельный класс "ClockDriver": a) создайте экземпляр часов, b) установите часы, минуты и секунды для часов и c) покажите время часов с помощью getTime(). Используйте пример класса Dog на стр. 36 в качестве руководства. Образец показан ниже:
Время 3:45:00
//Не беспокойтесь, если вы не можете получить оба нули в
//второе поле. Это проблема форматирования
//мы будем иметь дело с более поздними
Вот мой класс Clock:
class Clock {
int hours;
int minutes;
int seconds;
public String toString() {
String temp = ("");
return temp.format("%02d:%02d:%02d", hours, minutes, seconds);
} //end method toString
public void getTime() {
System.out.print("The time is " + toString());
} //end method getTime
} //end class Clock
И вот мой класс ClockDriver:
public class ClockDriver {
public static void main (String[] args) {
Clock c = new Clock();
c.hours = 4;
c.minutes = 30;
c.seconds = 00;
c.getTime();
} //end main
} //end class ClockDriver
Несмотря на то, что он компилируется отлично и работает красиво, я получаю то, что, по моему мнению, является предупреждением от IDE, говорящим, что мой
return temp.format("%02d:%02d:%02d", hours, minutes, seconds);
линия обращается к статическому элементу через ссылку на экземпляр. В частности,
temp.format
бит.
Итак, мои вопросы:
1.) Почему обращение к статическому члену через ссылку экземпляра не обязательно рекомендуется?
2.) Есть ли лучший способ объединить это, чтобы я не получал доступ к статическому элементу через ссылку экземпляра?
Спасибо заранее!
Ответы
Ответ 1
Статические методы относятся к самому классу, а не к любому экземпляру. Хотя вы можете вызвать метод static
из экземпляра класса, вам не нужно использовать экземпляр класса, и вы не должны. Это может сбивать с толку, потому что похоже, что метод не static
, хотя он static
.
Лучшим и ясным способом вызова метода static
является использование самого имени класса, а не экземпляра класса, для вызова метода:
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
И вам вообще не нужен экземпляр temp
.
Ответ 2
Имейте в виду, что если экземпляр определенного класса, позвонив ему c, имеет функцию void foo()
, и вы используете экземпляр c
для вызова foo
следующим образом:
c.foo();
то, что на самом деле называется:
foo(c);
при вызове статической функции void foo2():
Class.foo2();
вызывается так, как он выглядит.
Вызов статической функции с использованием экземпляра указывает на пользователя, который, вероятно, не уверен, что он делает.
Ответ 3
На самом деле вы не должны использовать строку temp
. Вы должны называть его String.format
. Чтобы ответить на ваш вопрос, это запутывает, так как вызов на самом деле не смотрит на temp
.