the coder is overriding the basic styles for :hover so that the buttons or whatever they are look different when someone hovers. Makes sense. The other two look like a "You Are Here" style-- meaning that in the whole menu, there is a menu item that should always look hovered-- even if it's been visited before. So there's a class on a single menu item called .current_page_item showing the visitor which page they're on by giving that item a highlight.
To make that change with every page (since it should be on a different menu item on different pages), lots of people use an id on the body. body id="home" or whatever, then the Home button on the menu would have the current_page_item class on it, and would tell visitors that they were back on the Home page. For instance.
They do, you are correct. You do NOT need all those declarations because "a" will make the rest the same. You only need to list :hover, :visited, etc. IF you want them different.
I think maybe you have all these extra declarations because this is a template. The writers of templates don't know what you will want to change, so they write all this extra code so that, if you wanted to change .current_page_item's :visited state, for example, then it's already there for you to edit.