Говоря про статик, на сколько я выяснил, он больше про процедурный подход, Когда программа является набором инструкций, без состояния, то есть просто сделай шаг 1, 2, 3. Отсюда следует, по крайней мере как я понял, Java ООП язык, но не чистый, как раз из за статики и примитивов. Где мы можем писать программы в процедурном стиле, без объектов и состояний. Не стоит злоупотреблять статикой. Модификатор static стоит использовать для утильных классов, то есть для классов без зависимостей, где мы не создаем внутри экземпляры, то есть нет зависимости от чьего то состояния. Примеры Collections.метод(), Arrays.метод(), ... То есть утильные классы для решения какой то определенной задачи, для упрощения выполнения какой то чисто технической вещи, что то получить, отсортировать, как то обработать и вернуть. Раздавать на лево и на право статик не стоит, только когда видим что возможно класс подходит под это. Насчет final static переменных, тут статик нужен больше как для указания, маркера, что переменная является некой константой, чисто технически насколько мне это понятно, большого смысла от статик в данном случае нет.