I'm thinking you may want to revisit a bit your knowledge of OOP, to be honest.
The thing, in my mind, is that inheritance in OOP defines what is called an "is-a" relationship between sub class and super class. For example, if you have a class Shape and a class Square or Circle, we can define an "is-a" relationship between these classes because a Circle "is-a" Shape, a Square "is-a" Shape. Any methods that operate with a Shape can operate with squares and circles because typically things that apply to a Shape will also apply to Squares and Circles.
My problem with your example is that, to me, a 3DPoint is not really the same as a 2DPoint. It will never be easy, in my mind, to convert/cast from a 3DPoint to a 2DPoint. I mean, you could try to do it by simply ignoring one of the coordinates (z for example) but it's still a bit weird to me. If I was designing this I would not make 3DPoint extends 2DPoint. I might have both classes extend something like a Vector class, but I wouldn't make 3DPoint extend 2DPoint. However, one perfectly valid method that you could create in 3DPoint would be:
class 3DPoint {
...
public 2DPoint to2D() {
return new 2DPoint(x, y);
}
}
This could be useful for you.
So, finally, a piece of advice: unless the design makes sense, that is, you can clearly see an "is-a" relationship between two classes, then I'd say don't use extension/inheritance, the lines of code that you will be saving will not pay of for the wrong design in the long run, especially as your code base gets bigger.
Hope this helps in any way.