well the main point with using repaint() instead of doing that yourself is that you cant control the time on when it happens when you are using repaint(), because it is actually not a demand to repaint, but a request. When you are making games, you want to control it yourself, because you want the painting to be done at accurate times, else the time between 2 redraws is different every time and you will see 'tearing' or flickering.
That's right, but tearing/flickering are unrelated problems. Using repaint() vs BufferStrategy.show() or some other method just comes down to timing - active vs passive rendering. Passive rendering is OK for board games since they're not real-time, they're turn-based. Animations really need to be actively-rendered - ie not queued on the event dispatch thread but done straight away in your own game loop thread.
Tearing is caused by not v-syncing with the monitor refresh. You can't avoid tearing unless in full screen mode.
Flickering is from not 'double-buffering'. Swing is double-buffered by default so repaint() won't cause flicker. BufferStrategy's with more than one buffer also won't flicker.
Hope that helps