В качестве некоторой предыстории, я сейчас нахожусь в главе 8 моей книги, мы закончили говорить об массивах, массивах, операторах if, циклах и т. Д. Теперь в этой части книги говорится о вызове по ссылке, значении и некоторых других довольно интересных вещах, которые кажутся Сначала это было странно. Я прочитал Какую ситуацию использовать static и некоторые другие вопросы SO, а также узнали немало.
Рассмотрим следующий пример, приведенный в моей книге (среди множества примеров)
Есть еще одна причина, по которой иногда необходимы статические методы. Если метод управляет классом, которым вы не владеете, вы не можете добавить его в этот класс. Рассмотрим метод вычисления площади прямоугольника. Класс Rectangle в стандартной библиотеке не имеет такой функции, и мы не можем изменить этот класс. Статический метод решает эту проблему:
public class Geometry
{
public static double area(Rectangle rect)
{
return rect.getWidth() * rect.getHeight();
}
// More geometry methods can be added here.
}
Теперь мы можем сказать вам, почему основной метод статический. При запуске программы никаких объектов нет. Следовательно, первый метод в программе должен быть статическим.
Хорошо, это довольно круто, до сих пор я просто слепо ставил public
перед всеми своими методами, так что это здорово знать. Но мое внимание привлекла небольшая проблема с обзором на следующей странице.
Следующий метод вычисляет среднее значение массива чисел:
public static double average(ArrayList<Double> values)
Почему это должен быть статический метод?
Здесь я хотел подожди секундочку. Я почти уверен, что раньше делал это без использования статики. Я попытался сделать это снова и довольно легко придумал следующее
import java.util.ArrayList;
class ArrList
{
private double sum;
public ArrList()
{
sum = 0;
}
public double average(ArrayList <Double> values)
{
for(int i = 0; i < values.size() ; i++)
{
sum+=values.get(i);
}
return sum / values.size();
}
}
public class Average
{
public static void main(String [] args)
{
ArrList arrListObj = new ArrList();
ArrayList<Double> testArrList = new ArrayList<Double>();
testArrList.add(10.0);
testArrList.add(50.0);
testArrList.add(20.0);
testArrList.add(20.0);
System.out.println(arrListObj.average(testArrList));
}
}
TL; DR
Почему в моей книге сказано, что public static double average(ArrayList<Double> values)
должен быть статичным?
ПОПЫТКА ПРИ ИСПОЛЬЗОВАНИИ СТАТИЧЕСКИХ ДАННЫХ
public class Average
{
public static void main(String [] args)
{
ArrayList<Double> testArrList = new ArrayList<Double>();
ArrayList<Double> testArrListTwo = new ArrayList<Double>();
testArrList.add(10.0);
testArrList.add(50.0);
testArrList.add(20.0);
testArrList.add(20.0);
testArrListTwo.add(20.0);
testArrListTwo.add(20.0);
testArrListTwo.add(20.0);
System.out.println(ArrList.average(testArrList));
System.out.println(ArrList.average(testArrListTwo)); // we don't get 20, we get 53.3333!
}
}
static
. Но нет реальной причины не использовать его, поскольку он позволяет избежать создания экземпляраArrList
. Кроме того, ваша реализация выйдет из строя, если вы попытаетесь использовать один и тот же экземплярArrList
для вычисления нескольких средних значений. - person resueman   schedule 11.08.2016average
дважды, с двумя разнымиArrayList
, и посмотрите, что произойдет. - person David   schedule 11.08.2016[10,15,20]
) к своему объекту и вычислите среднее значение, он правильно выдаст 15. с использованием того же объекта, если вы добавите еще один список (скажем,[1,2,3]
),arrListObject.average([1,2,3])
не выдаст 2, как ожидалось, из-за предыдущего состояния - вместо этого вы получите 17. - person Kevin L   schedule 11.08.2016static
не сам по себе решает эту проблему. Устранение зависимости состояния, внешнего по отношению к методу (переменной экземпляра), решает проблему. Если нет состояния, внешнего по отношению к методу, это потенциальный кандидат на рольstatic
метода, если семантически имеет смысл сделать его таковым. - person David   schedule 11.08.2016sum
никогда не сбрасывался каждый раз - person Kevin L   schedule 11.08.2016static
и надеялись, что произойдет волшебство, но на самом деле не устранили проблему сохранения состояния вне метода. - person David   schedule 11.08.2016