Start here. This is the direct spoken answer to practice first.
Overview
The important distinction is the value a variable holds and the operations Java allows, not a memorized claim about one category always living on the stack.
A primitive variable directly holds a primitive value such as an int, boolean, or double. A reference variable holds a reference that can identify an object or be null. Assigning one primitive variable to another copies the primitive value. Assigning a reference copies the reference, so both variables may point to the same object. Primitives use language-defined value semantics and cannot call instance methods; objects provide fields and methods through their references.