Lots of good answers already but I just wanted to add to Josh Dawson's point about not exposing private data members.
The only getter that you need to have is
One thing to watch out for here, when I think "size" such as list.size(), I think current number of elements, not maximum capacity. Maybe a name such as getCapacity or getMaxSize might be more descriptive.
Anybody using the stack shouldn't need to know or care about the
top variable, it is just an implementation detail.
top also acts as a value which represents the number of elements that are in the stack. So I would maybe create a getter not called
getTop() but maybe
getNumElements() or something along those lines. (or
getSize() if you decided to rename your current one)
One pitfall here is that you start top at -1. If you started it at 0 and used top++ instead of ++top it would reliably give back the number of elements without the user needing to know that a value of -1 means "no elements", they would just be left with a 0 instead!
setSize(int size) method can also break your stack. All it's doing is mutating the
size variable. It's not actually adjusting the size of the internal array and copying over existing elements (say like an ArrayList does)
If you do want to provide a way of expanding the stack, you could implement something similar.
setStackArray(T stackArray) method is also extremely dangerous. Consider the following code
MyStack<String> myStack = new MyStack<>(10);
String updatedArray = new String;
myStack.setStackArray(updatedArray); // 'size' is now 10
Code like this could end up corrupting the state of your object.
In general I would try to avoid passing references to any objects that are implementation details, and if you have to, clone or copy them as said in the other answers.
If you're looking for ways to add new features, you could consider implementing the Iterable interface, so you could iterate through with a for each loop.
You could also override the equals and toString methods.