There are no contradictions here.
You define enum (which is an "object blueprint") and tell -- "I have an abstract method".
Then you define inside the enum body all possible instances, and each of them is (a) concrete -- because JVM calls implicitly constructor and constructor may be called on concrete class (b) has an implementation of the abstract method
So, all are happy! 8-)
It would fail to compile if any of your declared instance did not implement "printHours", in that case it would remain abstract, and JVM would not be able to create an instance of particular enum constant.