The better approach, in terms of practice, would be your first suggestion:
Pass the main class to all of my classes using a constructor
This is called dependency injection, and is the preferred alternative over global access.
It discourages over-exposure (encourages encapsulation, which is good), and makes testing easier by allowing natural mocking (opposed to using a framework like PowerMock). It's recommended you use this approach if possible.
As for your second suggestion:
Should I just use a static method that returns the instance
This approach tends to be frowned upon, especially if Main
is mutable.
If you expose a global mutable instance, you are introducing global state, which tends to be a pain.
Any module that relies on it may wind up be coupled to other modules that rely on it. This is referred to as common coupling, and should be avoided if possible, as it's one of the tightest forms of coupling.
Global access make accessing easier, but at the price of potentially tangling up code. It should really only be used when required.