no, no, no, that's not how it works.
in your Stats class, where you write:
you simply declare a member field with a name and a type, but you do not create any new objects here! the only time in java when you create new objects, is when you call "new", like in your main (that is part of MainApp), where you create
Player plr = new Player(); // <- notice the "new" here, this and only this creates an object
then when you assign player in Stats() constructor (constructor's called that, because it's the method that constructs a new object) to the member field this.plr, you do not copy the whole player object, but you merely make the private member field "point" to the same object that was passed in as an argument. or, to be more precise, what you pass in as argument is not the object itself, but a reference to that object. so the constructor:
public Stats(Player plr) {
this.plr = plr; // <- this copies the value of the argument, which in this case is a reference to an object! this DOES NOT copy the object itself!!!!
}
merely copies the reference to the object, but does not copy the object itself. there's still only one player object around, but it's referred to now in two different places. if you make a modification to player from one place (such as setting plr.A = 5), then getA() called from the other reference will also now return 5.
the only things that behave like you thought they do are primitives in java. there's only a few of them, boolean, int, float, etc. all these primitive types do indeed get copied around, but they have special status in java, absolutely all other objects are accessed via references, and any assignments done with objects merely copy the value of the reference, but not the object.
you should probably google for good introductory java book, I don't know any off my head, but I'm sure stackoverflow has a few answers lying around.
edit: an exception to the "new" rule is strings of various kinds. all strings in Java are objects, not primitives, but they do not need a "new" to be created, a string literal is enough. so, when you type:
String myFancyString = "Look, how fancy I am!";
you DO create a new object, to which the variable myFancyString refers to. thought this was worth mentioning.