Post

01. Java Overview

✨ Dive into the world of Java programming! Explore its rich history, compare it with other languages, and get hands-on with the essentials like JDK, JVM, and Eclipse setup to kickstart your development journey. 🚀

01. Java Overview

What we will learn in this post?

  • 👉 Introduction to Java
  • 👉 History of Java
  • 👉 Java vs C++ vs Python
  • 👉 How to Download and Install Java
  • 👉 Setting Up the Environment in Java
  • 👉 How to Download and Install Eclipse on Windows
  • 👉 Java Development Kit (JDK) in Java
  • 👉 JVM and its Architecture
  • 👉 JDK vs JRE vs JVM
  • 👉 Just In Time (JIT) Compiler
  • 👉 JIT vs JVM
  • 👉 Byte Code vs Machine Code
  • 👉 Conclusion!

Java: A Versatile Programming Language ☕

Java is a powerful and popular programming language known for its portability and object-oriented nature. Think of it like a set of Lego bricks – you can combine different pieces (code) to build many things.

Key Features ✨

  • Portability: Java code runs on any device with a Java Virtual Machine (JVM), like your phone, computer, or server. It’s like having a universal translator for your code. Example: Write once, run anywhere (WORA).

  • Object-Oriented Programming (OOP): Java organizes code into “objects,” making it easier to manage complex projects. Think of objects as containers holding data (like a user’s name and age) and actions (like logging in).

Object-Oriented Example

1
2
3
4
class Dog {
  String name;
  void bark() { System.out.println("Woof!"); }
}

Java in Action 🌎

  • Web Applications: Many websites use Java for backend processing (the “behind-the-scenes” work). Example: Large e-commerce sites.
  • Mobile Applications: Android apps are often built using Java (or Kotlin, which works well with Java).
  • Enterprise Applications: Large-scale business systems often rely on Java’s robustness and scalability.

Java’s popularity stems from its reliability, vast community support, and wide range of applications. It’s a solid choice for beginners and experienced programmers alike.

Java’s Journey: From J2SE to Java 21 🚀

Java’s story began in the mid-1990s. Initially called Oak, it evolved into Java and quickly gained popularity. While “Java 2” (J2SE) marked a significant step, true evolution began later.

Major Milestones 🗓️

  • Java 5 (2004): Introduced generics <T>, improving type safety and reducing code bloat.
  • Java 8 (2014): A game-changer with lambdas (x) -> x + 1 and streams, enabling functional programming and simplifying parallel processing.
  • Java 11 (2018): Marked a shift to a new release model with Long-Term Support (LTS) versions, providing extended updates and stability.

Recent Advancements 💡

  • Java 17 (2021): Another LTS release, building upon previous improvements and offering enhanced performance and security.
  • Java 21 (2023): The latest release, featuring Project Loom, a groundbreaking project introducing virtual threads for significantly improved concurrency and scalability. This makes it easier to write highly concurrent applications.

Project Loom’s Impact

Project Loom simplifies concurrent programming, reducing the complexity of managing many threads. This leads to more efficient and responsive applications.

graph LR
    style A fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style B fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style C fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style D fill:#03A9F4,stroke:#0288D1,stroke-width:2px,color:#FFFFFF,font-size:14px

    A[📱 Application] --> B(📝 Many Tasks)
    B --> C{🔄 Virtual Threads?}
    C --> D[⚡ Improved Concurrency]

Java’s evolution continues, constantly adapting to changing technological demands. Its commitment to regular updates and focus on developer experience ensures its continued relevance in the ever-evolving world of software development.

Java vs. C++ vs. Python 💻

Syntax Comparison ✍️

Java vs. C++ vs. Python 💻

Syntax Comparison ✍️

LanguageSyntax ComplexityExample CodeKey Features ✨
JavaVerbose and Structuredpublic class HelloWorld { public static void main(String[] args) { System.out.println("Hello!"); } }🛠️ Verbose syntax for clarity. Requires explicit declaration of the class and main method.
C++Flexible but Complex#include <iostream> int main() { std::cout << "Hello!" << std::endl; return 0; }🔧 More control over system resources. Requires manual handling of memory and file streams.
PythonConcise and Readableprint("Hello!")✍️ Concise and readable syntax. Emphasizes ease of learning and writing.

Key Points

  • Java 🛠️: Uses a more structured approach, requiring more code to achieve basic tasks. Its syntax is precise, making it easier for developers to maintain large systems.
  • C++ 🔧: Provides more control over hardware and memory, offering better performance, but at the cost of complexity. It’s ideal for system-level programming.
  • Python ✍️: Known for its simplicity and readability, Python allows developers to write code quickly and intuitively. Perfect for beginners and rapid development.

Performance 🚀

  • C++: Generally the fastest due to its low-level control and ability to directly manage memory.
  • Java: Compiles to bytecode, offering good performance with the Java Virtual Machine (JVM). Performance can vary based on JVM optimization.
  • Python: Interpreted language; slower than Java and C++ but easier to use.

Primary Use Cases 🎯

  • Java: Android development, enterprise applications, large-scale systems.
  • C++: System-level programming, game development, high-performance computing.
  • Python: Data science, machine learning, web development, scripting.

Summary Table 📊

FeatureJavaC++Python
SyntaxVerboseComplexConcise
PerformanceGoodFastestSlowest
Use CasesAndroid, EnterpriseSystems, GamesData Science, Web

This simple comparison highlights the key differences. The best choice depends on your project’s specific needs.

Java JDK Installation Guide ☕

This guide helps you install Java JDK on Windows or Mac.

Download Java JDK ⬇️

  1. Go to https://www.oracle.com/java/technologies/javase-downloads.html.
  2. Accept the license agreement.
  3. Download the correct installer for your operating system (Windows or macOS).

Installation ⚙️

  1. Windows: Run the downloaded .exe file and follow the on-screen instructions. Choose a custom installation path if you want more control.
  2. macOS: Open the downloaded .dmg file, drag the JDK installer into the Applications folder, and then run it.

Setting JAVA_HOME 🏡

  1. Find the JDK installation path: This is where you installed the JDK (e.g., C:\Program Files\Java\jdk-17 on Windows, /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home on macOS).
  2. Set JAVA_HOME:
    • Windows: Search for “environment variables”, edit the System variables, and add a new variable named JAVA_HOME with the JDK path as its value.
    • macOS: Open your .zshrc or .bashrc file in a text editor, add export JAVA_HOME="/path/to/jdk/home", replacing /path/to/jdk/home with your actual JDK path, and save the file. Then run source ~/.zshrc or source ~/.bashrc in your terminal.

Add to PATH 🗺️

  1. Windows: Edit the System variables Path and add %JAVA_HOME%\bin to the end.
  2. macOS: Add export PATH="$JAVA_HOME/bin:$PATH" to your .zshrc or .bashrc file (same as step 2 above for JAVA_HOME).

Restart your computer after completing the steps.

graph TD
    A[Download JDK] --> B{Install JDK};
    B --> C[Set JAVA_HOME];
    C --> D[Add to PATH];
    D --> E[Restart];

    style A fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style B fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style C fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style D fill:#03A9F4,stroke:#0288D1,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px

Now you have Java installed and ready to use! 🎉

Setting up your Java Development Environment ☕

1. Download and Install the JDK ⬇️

  • Go to the official Oracle website or AdoptOpenJDK and download the JDK installer suitable for your operating system (Windows, macOS, or Linux).
  • Run the installer and follow the on-screen instructions. Remember where you install it! (e.g., C:\Program Files\Java\jdk-17 on Windows)

2. Configure Environment Variables ⚙️

Setting JAVA_HOME

  • Windows: Search for “environment variables,” click “Edit the system environment variables,” then “Environment Variables…”. Create a new System variable named JAVA_HOME and set its value to your JDK installation path (e.g., C:\Program Files\Java\jdk-17).

  • macOS/Linux: Instructions vary depending on your shell (bash, zsh etc.). You’ll typically edit a file like .bashrc or .zshrc and add export JAVA_HOME=<your_jdk_path>.

Setting PATH

  • Add the path to the bin directory within your JDK installation to the PATH environment variable. For example: %JAVA_HOME%\bin (Windows) or $JAVA_HOME/bin (macOS/Linux). This allows you to run javac and java from any directory.

3. Verification 🎉

Open your terminal or command prompt and type:

1
2
java -version
javac -version

If you see the Java version information, you’ve successfully set up your Java development environment!

graph TD
    A[Download JDK 🖥️] --> B{Install JDK 🛠️};
    B --> C[Set JAVA_HOME ⚙️];
    C --> D[Set PATH 🌍];
    D --> E[Verify Installation ✅];
    E --> F[Success! 👍];

    style A fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style B fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style C fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style D fill:#03A9F4,stroke:#0288D1,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#8BC34A,stroke:#558B2F,stroke-width:2px,color:#FFFFFF,font-size:14px
    style F fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px

Eclipse IDE for Java on Windows ☕

Download & Installation ⬇️

  1. Download the Eclipse IDE for Java Developers from the official website. Choose the Windows 64-bit installer.
  2. Run the installer. Choose a directory (e.g., C:\eclipse), and extract the contents.

Setting up the JRE ⚙️

  • Eclipse usually detects your JRE automatically. If not, go to Window -> Preferences -> Java -> Installed JREs.
  • Click Add, select Standard VM, point to your JDK installation (C:\Program Files\Java\jdk-version), and click Finish.

Creating a Java Project 🚀

  1. Click File -> New -> Java Project.
  2. Name your project (e.g., MyFirstProject).
  3. Click Finish.
  4. Right-click on the project -> New -> Class.
  5. Name your class (e.g., Main). Check the box for public static void main(String[] args).
  6. Write your code (e.g., System.out.println("Hello, World!");).
  7. Run your code by right-clicking and selecting Run As -> Java Application.
graph TD
    A[Download Eclipse 🌐] --> B(Install Eclipse 🛠️);
    B --> C{JRE Detected? 🤔};
    C -- Yes --> D[Create Project 📂];
    C -- No --> E[Configure JRE ⚙️];
    E --> D;
    D --> F[Write & Run Code 💻];

    style A fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style B fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style C fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style D fill:#03A9F4,stroke:#0288D1,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#8BC34A,stroke:#558B2F,stroke-width:2px,color:#FFFFFF,font-size:14px
    style F fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px

Remember to replace placeholders like jdk-version with your actual JDK version.

Java Development Kit (JDK) Explained ☕

The Java Development Kit (JDK) is everything you need to develop Java applications. Think of it as your complete toolbox!

Key Components 🛠️

  • JRE (Java Runtime Environment): This is the engine that runs your Java programs. It includes the Java Virtual Machine (JVM) and core libraries. Think of it as the car engine.

  • Compiler (javac): This translates your human-readable Java code (*.java) into bytecode (*.class), which the JVM understands. Think of it as the translator.

  • Tools: The JDK provides many tools, javac being the most important. Others help with debugging, documentation, and more.

Compiling and Running a Java Program 🚀

Let’s create a simple program:

1
2
3
4
5
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
  1. Compile: Open your terminal, navigate to the file location, and type javac HelloWorld.java. This creates HelloWorld.class.

  2. Run: Type java HelloWorld. This runs the bytecode, printing “Hello, World!” to the console.

Simple Flowchart

graph TD
    A[Java Code *.java* 📄] --> B{javac Compiler ⚙️};
    B --> C[Bytecode *.class* 💾];
    C --> D{JVM 🖥️};
    D --> E[Output 🖨️];

    style A fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style B fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style C fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style D fill:#03A9F4,stroke:#0288D1,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px

In short, the JDK is your essential toolkit for creating and running Java applications, comprising the JRE, the compiler (javac), and other useful tools. It’s a crucial component for any Java developer.

Java Virtual Machine (JVM): Platform Independence ☕

The JVM is the engine that runs Java applications. Its key role is making Java platform-independent (write once, run anywhere). Instead of compiling directly to machine code, Java compiles to bytecode, a platform-neutral intermediate language.

JVM Architecture ⚙️

The JVM consists of several key components:

  • Class Loader: Loads .class files (bytecode) into memory.
  • Bytecode Verifier: Ensures bytecode safety.
  • Execution Engine: Interprets or compiles bytecode to machine code (Just-In-Time compilation).
  • Garbage Collector: Automatically manages memory, reclaiming unused objects.
  • Runtime Data Areas: Stores data like method areas, heap, stack, etc.

Bytecode Execution Flowchart

graph LR
    A[Java Code 📄] --> B{Compilation ⚙️};
    B --> C[Bytecode *.class* 💾];
    C --> D[Class Loader 🛠️];
    D --> E[Bytecode Verifier 🔍];
    E --> F[Execution Engine 🚀];
    F --> G[Machine Code/Interpretation 💻];
    G --> H[Output 🖨️];

    style A fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style B fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style C fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style D fill:#03A9F4,stroke:#0288D1,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#8BC34A,stroke:#558B2F,stroke-width:2px,color:#FFFFFF,font-size:14px
    style F fill:#9C27B0,stroke:#7B1FA2,stroke-width:2px,color:#FFFFFF,font-size:16px
    style G fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px
    style H fill:#00BCD4,stroke:#0097A7,stroke-width:2px,color:#FFFFFF,font-size:14px

Simple Example 💻

1
2
3
4
5
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

This Java code is compiled to HelloWorld.class (bytecode). The JVM loads this bytecode, verifies it, and then executes it, printing “Hello, World!” on the console, regardless of the underlying operating system. This demonstrates Java’s portability thanks to the JVM.

Understanding JDK, JRE, and JVM ☕

Java development and execution rely on three key components: the Java Development Kit (JDK), the Java Runtime Environment (JRE), and the Java Virtual Machine (JVM). Think of them as nested building blocks.

The Java Virtual Machine (JVM) ⚙️

The Engine

The JVM is the core engine. It’s the runtime environment that executes Java bytecode (.class files). Imagine it as a translator, converting the bytecode into instructions your computer’s processor can understand. Without the JVM, you can’t run Java programs.

The Java Runtime Environment (JRE) 📦

The Package

The JRE includes the JVM plus libraries (pre-written code) needed for your Java programs to run. It’s like a toolbox with all the essential tools. If you only need to run a Java program, you just need the JRE.

The Java Development Kit (JDK) 🛠️

The Complete Kit

The JDK is the complete package for Java development. It contains the JRE plus tools like the Java compiler (javac), debugger (jdb), and other utilities needed to create Java programs. Think of it as the complete workshop, including the toolbox (JRE) and all the construction tools.

In short: JDK contains JRE, which contains JVM. You need the JDK to write Java code, and the JRE (or JDK) to run it.

graph LR
    JDK[Java Development Kit 🛠️] --> JRE[Java Runtime Environment 🌐];
    JRE --> JVM[Java Virtual Machine 🖥️];

    subgraph "Development 🧑‍💻"
        JDK
    end
    subgraph "Execution 🚀"
        JRE
        JVM
    end

    style JDK fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style JRE fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style JVM fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px

Java’s Just-In-Time (JIT) Compiler 🚀

Understanding JIT Compilation

Java programs are initially compiled into bytecode, an intermediate language. The Java Virtual Machine (JVM) then uses the JIT compiler to translate this bytecode into native machine code during program execution. This is unlike traditional compilers which translate the entire source code before execution.

How JIT Improves Performance

  • Optimized Machine Code: JIT compilers analyze the running program’s behavior and optimize the generated machine code for specific hardware and conditions. This leads to significant speed improvements.
  • Adaptive Optimization: JIT continuously monitors the code’s execution path and refines the generated machine code over time. Frequently executed code segments are optimized more aggressively.

A Simple Example 💡

Consider a loop that calculates the sum of numbers:

1
2
3
4
long sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum += i;
}

Initially, the JVM executes this loop using interpreted bytecode. As the loop runs repeatedly, the JIT compiler recognizes the pattern and optimizes the machine code for this specific loop, resulting in faster execution on subsequent iterations. The improvement becomes noticeable for computationally intensive tasks.

Visual Representation 📊

graph TD
    A[Java Source Code 📝] --> B[Bytecode Compilation 🛠️];
    B --> C{JVM Execution ⚙️};
    C -- First Run ⏳ --> D[Interpreted Bytecode *Slow* 🐢];
    C -- Subsequent Runs 🚀 --> E[JIT Compilation *Native Code* ⚡];
    E --> F[Optimized Execution *Fast* 🚀];

    style A fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style B fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style C fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style D fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#00BCD4,stroke:#0097A7,stroke-width:2px,color:#FFFFFF,font-size:14px
    style F fill:#8BC34A,stroke:#558B2F,stroke-width:2px,color:#FFFFFF,font-size:14px

The diagram shows that the first runs use interpreted bytecode, whereas subsequent runs use optimized native code thanks to JIT compilation. This results in a significant performance boost over time.

Java Runtime: JVM & JIT ☕

The Java Virtual Machine (JVM) ⚙️

The JVM is the runtime environment for Java programs. It’s platform-independent, meaning the same bytecode runs on different operating systems. The JVM loads .class files (bytecode) and manages memory, security, and execution.

Bytecode Execution Flow

graph TD
    A[Load .class file 📂] --> B{Verify Bytecode 🔍};
    B -- Valid ✅ --> C[Interpret/JIT Compile ⚡];
    B -- Invalid ❌ --> D[Error 🚨];
    C --> E[Execute ▶️];

    style A fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style B fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style C fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style D fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#8BC34A,stroke:#558B2F,stroke-width:2px,color:#FFFFFF,font-size:14px

Just-In-Time (JIT) Compilation 🚀

JIT is a component of the JVM that improves performance. Instead of interpreting bytecode line by line (slow), JIT compiles frequently executed bytecode sections into native machine code at runtime. This leads to significant speed boosts.

Example

1
2
3
4
5
6
7
8
9
public class Example {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 0; i < 100000; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}

This simple loop would benefit greatly from JIT compilation as it’s executed repeatedly. The JVM initially interprets it, then JIT compiles it for faster execution during subsequent iterations.

  • JVM: Loads and manages bytecode.
  • JIT: Optimizes bytecode to native code for faster execution. Both work together for efficient Java program execution.

Bytecode vs. Machine Code ☕

Understanding the Difference

Imagine you’re writing a recipe (your program). Machine code is like writing the recipe directly in the language of a specific oven (computer). Each oven understands a different language, so the recipe needs to be rewritten for every oven. Bytecode, however, is like writing the recipe in a standard, intermediate language. A translator (the JVM) then converts it into the language of the specific oven.

Java and Cross-Platform Support

Java uses bytecode to achieve cross-platform compatibility. When you compile a Java program, it doesn’t create machine code directly. Instead, it generates bytecode (.class files). This bytecode is platform-independent.

Example:

  1. You write a Java program (HelloWorld.java).
  2. The Java compiler compiles it into bytecode (HelloWorld.class).
  3. The Java Virtual Machine (JVM), specific to your operating system (Windows, macOS, Linux), reads and interprets this bytecode, translating it into the native machine code of your computer.
graph LR
    A[Java Code *.java* 📄] --> B(Java Compiler 🛠️);
    B --> C[Bytecode *.class* 💻];
    C --> D{JVM *Windows* 🪟};
    C --> E{JVM *macOS* 🍏};
    C --> F{JVM *Linux* 🐧};
    D --> G[Machine Code *Windows* 💾];
    E --> H[Machine Code *macOS* 💻];
    F --> I[Machine Code *Linux* ⚙️];

    style A fill:#4CAF50,stroke:#2E7D32,stroke-width:2px,color:#FFFFFF,font-size:16px
    style B fill:#FFC107,stroke:#FFA000,stroke-width:2px,color:#000000,font-size:14px
    style C fill:#2196F3,stroke:#1976D2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style D fill:#03A9F4,stroke:#0288D1,stroke-width:2px,color:#FFFFFF,font-size:14px
    style E fill:#8BC34A,stroke:#558B2F,stroke-width:2px,color:#FFFFFF,font-size:14px
    style F fill:#9C27B0,stroke:#7B1FA2,stroke-width:2px,color:#FFFFFF,font-size:14px
    style G fill:#FF5722,stroke:#D84315,stroke-width:2px,color:#FFFFFF,font-size:14px
    style H fill:#00BCD4,stroke:#0097A7,stroke-width:2px,color:#FFFFFF,font-size:14px
    style I fill:#FF9800,stroke:#F57C00,stroke-width:2px,color:#000000,font-size:14px

  • Bytecode: Platform-independent intermediate code.
  • Machine Code: Platform-specific instructions directly understood by the CPU.

This allows the same Java bytecode to run on any machine with a compatible JVM, making Java truly “write once, run anywhere”. 🎉

Conclusion

And there you have it! We’ve covered a lot of ground today, and hopefully, you found this information helpful and interesting 😊. We’re always striving to improve, so we’d love to hear your thoughts! What did you think of this post? Any questions, feedback, or suggestions? Let us know in the comments below 👇. We can’t wait to hear from you! 🎉

This post is licensed under CC BY 4.0 by the author.