What's the nearest substitute for a function pointer in Java?
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.
Introduction
Java does not have C-style function pointers, but it does have several ways to pass behavior around. In modern Java, the nearest everyday substitute is a functional interface used with a lambda expression or method reference.
The Practical Answer
If by "function pointer" you mean "a value that represents some callable behavior that I can pass to another method," then in Java the usual substitutes are:
- functional interfaces
- lambdas
- method references
This is the standard modern style.
Functional Interface Example
A functional interface is an interface with exactly one abstract method. That makes it a target for lambdas.
This gives you much of what a function pointer is used for in other languages: behavior passed as data.
Built-In Functional Interfaces
You often do not even need to define your own interface. Java ships with many in java.util.function.
Some common choices are:
- '
Supplier' - '
Consumer' - '
Function' - '
Predicate' - '
BiFunction' - '
IntBinaryOperator'
These are usually the cleanest starting point.
Method References
If the behavior already exists as a method, a method reference is the most pointer-like syntax Java offers.
Main::add is not a raw memory address like a C function pointer, but it serves a similar everyday role: a named callable target passed around as a value.
What Java Does Not Offer
Java does not expose direct function addresses the way C does. That means you do not get:
- raw pointer arithmetic
- arbitrary calls through memory addresses
- low-level function-address manipulation
That restriction is intentional and fits Java's managed-runtime design.
So the substitute is conceptual, not literal. You are passing an object that represents behavior, not a machine-level code pointer.
Pre-Java 8 Style
Before lambdas, Java used anonymous classes for the same idea.
This is still valid, but lambdas are shorter and usually clearer for single-method behavior.
Lower-Level Alternatives
If you need something more dynamic than normal lambdas, Java also has:
- reflection
- '
MethodHandle'
Those are not the nearest substitute for everyday function pointers, though. They are lower-level invocation tools and are usually reserved for frameworks, dynamic libraries, or advanced metaprogramming.
For normal application code, functional interfaces are the right abstraction.
When to Use Which Style
A simple rule:
- existing method already matches: use a method reference
- small inline behavior: use a lambda
- reusable domain-specific callback: define a functional interface
That covers most Java use cases that would call for function pointers in other languages.
Common Pitfalls
Trying to translate C-style pointer thinking directly into Java usually leads to overcomplicated designs. Java's callable abstractions are object-oriented rather than memory-address-based.
Using reflection when a functional interface would do makes code slower, more fragile, and harder to read.
Defining a custom interface for every tiny callback can be unnecessary when built-in interfaces from java.util.function already fit the job.
Confusing method references with immediate method calls is also common. Main::add refers to behavior, while Main.add(1, 2) actually executes it.
Summary
- Java has no direct C-style function pointers.
- The nearest normal substitute is a functional interface used with a lambda or method reference.
- Built-in interfaces in
java.util.functioncover many common callback shapes. - Method references are the most pointer-like everyday syntax in modern Java.
- Reflection and
MethodHandleexist, but they are more advanced tools than the usual substitute.
Related reading
- What's the point of using Future without multithreading?
- What's the purpose of META-INF?
- What's the reason I can't create generic array types in Java?
- What's the syntax for mod in Java?
- When is a thread_local global variable initialized?
- When must you pass io_context to boostasiospawn? C
- What's wrong with overridable method calls in constructors?
- What's wrong with using to compare floats in Java?

OOD Fundamentals
Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.