What's the access modifier of the default constructor in java?

I thought its access modifier is public, but when I deal with a inner class issue, I found maybe I was wrong.

Yup. Indeed, I found myself in the same situation a couple of years ago. I was surprised by an error (through Guice injection, which made it slightly harder to find).

The key is to check the spec, in this case section 8.8.9:

In a class type, if the class is declared public, then the default constructor is implicitly given the access modifier public (§6.6); if the class is declared protected, then the default constructor is implicitly given the access modifier protected (§6.6); if the class is declared private, then the default constructor is implicitly given the access modifier private (§6.6); otherwise, the default constructor has the default access implied by no access modifier.

So in this case, your constructor is implicitly protected.