While experimenting with interfaces in Java and Golang, I noticed some fundamental differences in how each language approaches abstraction. This post summarizes those insights for anyone curious about both worlds.
A. Definition and Declaration
In Java:
- An interface is an explicit construct declared using the interface keyword.
- Classes must explicitly declare that they implement an interface using the implements keyword.
interface Shape { void draw(); } class Circle implements Shape { public void draw() { System.out.println("Drawing Circle"); } } In Go:
type Shape interface { Draw() } type Circle struct{} func (c Circle) Draw() { fmt.Println("Drawing Circle") } An interface is also declared using the interface keyword, but implementation is implicit.
A type (struct) implements an interface automatically if it defines all the methods in that interface.
👉 Key difference:
In Java, a class must declare that it implements an interface.
In Go, a type implements an interface implicitly — no need to declare it.
B. Method Implementation and Type Checking
Java:
- Statically checked at compile time.
- If a class claims to implement an interface but doesn’t define all methods, compilation fails.
- Strongly tied to inheritance hierarchy.
Go:
- Also statically checked, but duck typing applies.
- As long as a type has all methods required by an interface, it’s valid.
- Promotes composition over inheritance.
C. Multiple Interfaces and Composition
Java:
- A class can implement multiple interfaces.
- Interface composition is explicit (using extends).
interface A { void a(); } interface B { void b(); } interface C extends A, B { void c(); } Go:
- Interfaces are composable — you can embed one interface into another.
- This is done by embedding rather than inheritance.
type A interface { a() } type B interface { b() } type C interface { A B c() } 👉 Go favors composition, while Java relies on inheritance.
D. Default Methods
Java:
- Since Java 8, interfaces can have default and static methods with implementation.
interface Shape { default void info() { System.out.println("I am a shape"); } } Go:
- Interfaces cannot have any implementation — they are purely abstract.
- Behavior must be defined on concrete types.
E. Nil and Zero Values
Java:
- null can represent an interface reference with no object.
Go:
- The zero value of an interface is nil.
- If an interface variable is nil, calling a method on it will panic.
F. Performance and Memory
Java:
- Uses JVM vtables for dynamic dispatch.
- Garbage collection handles object lifetime.
Go:
- Uses interface value pairs (type + data pointer).
- Interface dispatch is efficient but slightly slower than direct method calls.
Hoping this article helped in understanding the nuances of interface in Java & Golang.
Happy Coding - onwards and upwards 🚀
Top comments (0)