One simple answer to the question "why does this expose implementation?" is that if you have two getters/setters that each return a double and are called X and Y, you are exposing that you've implemented the Point class using [Carthesian Coordinates][1] rather than, say, [Polar Coordinates][2].

Also, giving people access to these X and Y values might lead them to manipulate them in calculations. For example; rather than using

 Point->distanceTo(otherPoint);

They might do something like:

 distance = sqrt(
 pow( PointA->getX() - PointB->getX(), 2 )
 + pow( PointA->getY() - PointB->getY(), 2 ) );

In addition to the code duplication that will inevitably happen, this makes a second assumption. This formula only works on a flat, rectangular plane. If you're actually representing a hexagon grid for example, then this function is simply wrong.

By not exposing how you're implementing a point on a field, you can later change between ways of storing these coordinates *and* you prevent people from trying to be clever with details they shouldn't concern themselves with in the first place.

 [1]: https://en.wikipedia.org/wiki/Cartesian_coordinate_system
 [2]: https://en.wikipedia.org/wiki/Polar_coordinate_system