Ok the advantages of using a constructor vs. using explicit initialization vs. instance init block could be like such:
An instance constructor can take arguments and can be overloaded. This allows you to set the object state according to external input. That is something obviously you can't do when you use explicit initialization or an init block.
An explicit initialization is limited to simple assignments such as like what you did in your example: private
String quality = "A"; You can't get too much more complex than that. You're limited to basically 1 line of code that results in the assignment.
An instance initialization block will let you execute multiple lines of code...try/catch exceptions, etc...and you can do complex calculations if necessary to arrive at your final value.
Additionally, keep in mind that the compiler copies instance init block code into all constructors...so this is a good way of sharing common initialization code between multiple constructors if
you should need to do so. Here's some more explanation:
http://download.oracle.com/javase/tutorial/java/javaOO/initial.html
I don't think there's any real rule of thumb so to speak...just use whatever fits best for the given scenario once you make sure that you fully understand the pros and cons of each approach. Once you get the grasp of the concepts then it will become pretty evident to you which usage is best for given scenarios. And thanks for posting this question, by the way. It forced me to recall some basics about which I hadn't thought much lately and reminded me of potentially powerful techniques that I don't often use but are available nonetheless.