Tags: Java, Object-Oriented Programming, Backend Development, Programming Fundamentals, Learning in Public
After working with JavaScript, TypeScript, and Python, I decided to focus on Java as my primary language for backend development and data structures and algorithms.
I started studying Java through the University of Helsinki’s Java Programming MOOC.
Although I already had programming experience, learning Java has encouraged me to revisit several fundamental concepts more carefully.
Understanding Objects and References
One concept that initially confused me was the difference between an object and a reference to an object.
Consider two variables that refer to the same object.
Changing the object’s state through one reference can affect what is observed through the other reference because both variables point to the same object.
This becomes especially important when working with mutable objects and designing methods that receive objects as parameters.
Understanding references has helped me think more carefully about how data moves through a program.
Understanding equals() and Object Identity
Another interesting topic was the difference between comparing references and comparing logical equality.
In Java, the == operator compares reference identity when used with objects.
The equals() method can instead compare objects according to their logical values, depending on how the class implements it.
By default, a class that does not override equals() inherits the identity-based behavior of Object.
For custom classes, implementing meaningful value equality may require overriding equals() and hashCode() consistently.
This is particularly relevant when working with collections such as HashSet and HashMap.
I realized that understanding equality is not just an academic exercise. It directly affects how objects behave inside real applications.
Encapsulation and Class Design
I have also been studying constructors, access modifiers, instance variables, and static methods.
These concepts have helped me understand why object-oriented programming is more than simply creating classes.
Encapsulation allows a class to control how its internal state is accessed and modified.
Constructors help establish the initial state of an object, while methods define the operations that the object supports.
Rather than exposing every field publicly, a class can provide a smaller and more controlled interface.
Why I Chose Java
My long-term goal is to become a backend engineer with strong foundations in software engineering and distributed systems.
Java is a useful language for studying these areas because of its mature ecosystem, static type system, and widespread use in backend applications.
I also plan to explore Spring Boot after strengthening my understanding of core Java.
For now, I am focusing on language fundamentals before moving into more advanced frameworks.
Final Thoughts
Learning another programming language has reminded me that knowing syntax is different from understanding software design.
The concepts I am studying in Java—references, object identity, encapsulation, and abstraction—apply far beyond Java itself.
I believe these fundamentals will help me become a better engineer regardless of which programming languages I use in the future.