Ooh, I remember a lot of this. Although I haven't touched Java in years, so newer versions might have changed things.
As I recall, Java is a "pass reference by value" language. When you pass a variable to a method you're always passing by value. What you have to understand is that each variable holds either a primitive or a reference, which is like an immutable pointer to an object. Objects never get passed to a function; only references to them. If you "assign a different object to a variable", what you're really doing is assigning it another reference. So if you modify an object referenced by a variable that was passed in, the object is modified as if it were passed by reference; but if you assign the variable another reference, the original object is unchanged.
If you modify an Object you're not copying it. But remember that when you "modify" an immutable Object, such as a String, you're always making a copy of it.
I think that about covers Objects. Oh, and all Objects are subclasses of Object, whether you like it or not.
The super class calls the constructor but I don’t understand the point of that since all sub-classes have access to the parent class methods anyway?
By this do you mean that a subclass has to call a superclass' constructor, or that superclass constructor doesn't run when you instantiate the subclass? I think that's right.
I'm afraid I didn't get into abstract classes much. The general rule for me was either you have a concrete class or you use interfaces, which have all abstract methods. I think with abstract classes you could have concrete methods alongside abstract ones, but when extending the class you had to implement all the abstract methods.