Short answer: because Java has other ways to accomplish the same thing, and the language goes out of its way to hide pointers behind references which do not have pointer semantics.
The primary benefit of a function pointer in C or C++ is for an external library to plug in functionality at runtime, because a class is not known at compile time. Consider a
WidgetFactory in an application. It is extensible: one may subclass it to produce new widget types. However, it is not possible for a C++ application to create a
PluginWidgetFactory because it has not been written yet.
Enter function pointers: after loading a DLL/SO file dynamically, that library will call a function in the main application and register itself as a factory. It will provide a function pointer to say "call this function and I will return my subclass of
WidgetFactory that your compiler knew nothing about."
In Java, you would use reflection. The Java
WidgetFactory would check a system property with the class name, and load the
PluginWidgetFactory dynamically using reflection.
While Java does not support function pointers, it can accomplish the same end goal using different mechanisms. The creators of Java felt these other ways were better due to their goal of hiding pointers.