Lists can have variable length. You can easily add and remove objects and they eliminate null checks. They can do anything an array can do, and more.
Classes shouldn't be allowed to access fields defined in other classes, because this makes it extremely difficult to maintain class invariants. Invariants are like "promises" you make regarding the state of an object. For instance, your Player class could promise that health never reaches levels higher than 100. If the field isn't private, it simply cannot promise this because it doesn't know if other classes exist that modify the field. These promises are important, because they allow you to prove correctness of your program, up to a certain point.
Doesn't it give you more confidence knowing that objects of the
String class, for example, won't suddenly change without you knowing about it? You should do the same for your own classes.