If you are using the same OutputStream in PrintWriter as System.out, then there is no real difference, apart from the fact that you're simply recreating what already exists, like reinventing the wheel.

If you want to be very precise, then you have to say that System.out.println() writes to the default output stream. This is usually shown at the console, but can equally well go into a file (if you've redirected it) or nowhere (when running without a console).

But System.out internally creates PrintWriter object.

Not exactly. It refers to a PrintStream object.

So why cant we use
PrintWriter.println(..) directly to write to console.

Because if you create a PrintWriter it is just another PrintWriter that writes to whatever you specified at the constructor. It is not the same thing as the one PrintStream that is used in System.out.

what is the advantage we r going to get with System.out.println(..) method of writing to console.

The advantage is that it's the only way to do it. Could you post an example of how you'd think of a different way to write to the console?

System.out is an instance of PrintWriter, like you say. But it's already been created, and directing the stream to stdout. So what advantage would there be for you to do it yourself? None, really. But you could do, if you wanted to