As mentioned here
Refresh
analyses the source-files to check if any changes were made from outside Eclipse, and if so, compiles files that were changed.
Clean
on the other hand removes all compiled classes and forces recompilation of the whole project (or workspace).