🚀 Day 26 – Java Full Stack Journey | Method Overloading (Deep Dive) + Command Line Arguments + Encapsulation Begins Today’s session was powerful. We moved from understanding how Java compiler thinks to stepping into the first pillar of OOPS – Encapsulation. 🔹 1️⃣ Method Overloading – Compiler Logic (Advanced Understanding) We revised that: Method Overloading = Multiple methods with same name inside the same class. 🔹 2️⃣ Command Line Arguments We understood: public static void main(String[] args) args is a 1D String array It is dynamically sized Values are passed from Command Prompt Example: java Demo ABC 123 Inside program: args[0] → "ABC" args[1] → "123" Important realization: Even if you pass numbers, 👉 They are still stored as Strings + operator → Concatenation Not arithmetic addition. 🔥 3️⃣ OOPS Begins – Encapsulation (First Pillar) Today we officially stepped into Object-Oriented Programming System (OOPS). OOPS is built on 4 pillars: 1️⃣ Encapsulation 2️⃣ Inheritance 3️⃣ Polymorphism 4️⃣ Abstraction And today we started with Encapsulation. 🔹 What is Encapsulation? Encapsulation is the process of providing security to the most important data and giving controlled access. Not just wrapping data. Not just hiding variables. It means: ✔ Protect critical data ✔ Allow controlled access ✔ Prevent direct manipulation 🔹 How Do We Achieve Encapsulation in Java? Step 1️⃣ → Make variable private Step 2️⃣ → Provide public setter and getter Example: class Bank { private int balance; public void setData(int x) { if(x >= 0) balance = x; else System.out.println("Invalid input"); } public int getData() { return balance; } } Now: ✔ Direct access → ❌ Not allowed ✔ Controlled access → ✅ Through methods This is real-world security logic. 🔹 Real-World Understanding Brain protected by skull Coolant protected inside AC Lens protected inside camera Balance protected inside Bank object Protection + Controlled Access = Encapsulation 💡 Biggest Learning Today Java is not just syntax. It’s: Understanding compiler behavior Understanding JVM execution Understanding memory Writing secure code Thinking like a software engineer We are no longer learning “Java basics”. We have officially entered serious OOPS architecture. Day 26 Complete ✅ #Day26 #Java #CoreJava #MethodOverloading #CommandLineArguments #OOPS #Encapsulation #FullStackJourney #LearningInPublic #SoftwareEngineer TAP Academy
Java Full Stack Journey: Encapsulation & Method Overloading
More Relevant Posts
-
🚀 Day 15 – Java Full Stack Journey | Methods, Stack Frame & Garbage Collection Today’s session was a deep dive into one of the most important pillars of Java: 👉 Methods (Functions) 👉 Stack & Heap Memory Behavior 👉 Garbage Collection Not just writing code — but understanding what happens inside RAM during execution. 🔹 1️⃣ What is a Method? A method is simply: A block of code that performs a specific task. Basic structure: public int add() { int c = a + b; return c; } Every method has: Access Modifier (public) Return Type (int) Method Name (add) Parentheses (input parameters) Body (logic) 🔹 2️⃣ Types of Methods (Covered Today) ✅ Method with No Input & No Output public void add() { int c = a + b; System.out.println(c); } Doesn’t take parameters Doesn’t return anything Uses void ✅ Method with No Input but Returns Output public int add() { int c = a + b; return c; } Key difference: print → Displays value on console return → Sends value back to caller Understanding this difference is crucial. 🔹 3️⃣ What Happens in Memory? (Very Important) When a program runs: Java Runtime Environment (JRE) has: Code Segment Stack Segment Heap Segment Static Segment 🧠 Stack Segment Stores method stack frames Stores local variables Follows LIFO (Last In, First Out) When a method is called: A stack frame is pushed After execution, it is popped 🧠 Heap Segment Stores objects Stores instance variables Objects live here If an object has no reference: 👉 It becomes a Garbage Object Java’s Garbage Collector automatically cleans it. No manual memory deallocation needed (unlike C/C++). 🔹 4️⃣ Important Concept: Return Type & Type Casting Return type must match the returned value Implicit type casting works during return Example: int → float ✅ (Implicit) float → int ❌ (Needs explicit casting) Even during return, Java follows type promotion rules. 💡 Biggest Takeaway Today Understanding: Method execution flow Stack frame creation Heap memory allocation Garbage collection Return vs Print difference This is what separates: ❌ Syntax learners From ✅ Real Java developers Today wasn’t about output. It was about internal execution clarity. Day 15 Complete ✔ #Day15 #Java #CoreJava #Methods #JVM #StackAndHeap #GarbageCollection #OOPS #FullStackJourney #LearningInPublic TAP Academy
To view or add a comment, sign in
-
-
📘 Java Learning – Collections Framework (Part 4: Set & Its Implementations) 🚀 Continuing my Core Java Collections journey, this time I focused on Set-based collections — where uniqueness and ordering rules really matter. Here’s a crisp breakdown 👇 2️⃣ Set Interface • Child interface of Collection • Duplicates are NOT allowed • Insertion order is NOT preserved • No new methods — only Collection methods are used Use Set when uniqueness is the top priority. 🔰 HashSet (C) • Underlying data structure: Hash Table • No duplicates • No insertion order • Allows one null • Heterogeneous objects supported • Best choice for fast search operations 📌 Important behavior Trying to add a duplicate doesn’t throw an error — add() simply returns false. 🧪 Short Example: HashSet hs = new HashSet(); hs.add("Java"); hs.add("Python"); hs.add("Java"); // ignored hs.add(null); System.out.println(hs); 🔰 LinkedHashSet (C) • Child class of HashSet • Underlying structure: HashTable + LinkedList • Insertion order is preserved • Still no duplicates 📌 Common use case Used in cache-like applications where: • Duplicates are not allowed • Insertion order must be maintained 🧪 Short Example: LinkedHashSet lhs = new LinkedHashSet(); lhs.add("A"); lhs.add("B"); lhs.add("C"); System.out.println(lhs); // [A, B, C] 🔰 SortedSet (I) • Child interface of Set • Stores elements in a sorted order • Sorting can be: • Natural ordering • Custom ordering (Comparator) 📌 Useful methods: • first(), last() • headSet(), tailSet(), subSet() • comparator() 📌 Natural sorting: • Numbers → Ascending order • Strings/Characters → Alphabetical order ⭐ Key Takeaway • HashSet → Fast search, no order • LinkedHashSet → Order + uniqueness • SortedSet → Ordered & structured data Choosing the right Set implementation is a design decision, not just an API choice 💡 Building strong Java fundamentals, one collection at a time ☕💻 #Java #CoreJava #CollectionsFramework #Set #HashSet #LinkedHashSet #SortedSet #JavaCollections #LearningJourney
To view or add a comment, sign in
-
🚀 Java SE 6: The "Mustang" Era of Performance & Architecture Released on 11 December 2006, Java SE 6 (codename Mustang) was a milestone that redefined the efficiency of the Java platform. It wasn't just an incremental update; it introduced a fundamental redesign of the HotSpot™ Client Compiler and shifted the platform's naming convention from "J2SE" to Java SE. Here’s a look back at the architecture and breakthroughs that made Java 6 a game-changer: 🕒 Version History: A New Identity Java 6 dropped the ".0" from its version name, though developers still recognized it internally as 1.6.0. It was developed under JSR 270 and focused heavily on transparency, with Sun publishing weekly source snapshots for the first time in Java's history. While it reached the end of its public update life in April 2013, its architectural influence persists today. 🏗️ Architectural Evolution The core of the release was a redesigned Just-In-Time (JIT) compiler, optimized for the responsiveness required by desktop applications. Key innovations included: SSA-Based HIR: The High-Level Intermediate Representation was moved to Static Single-Assignment (SSA) form, enabling more aggressive global optimizations like value numbering and null-check elimination. Linear Scan Register Allocation: A new global algorithm replaced older heuristics, producing significantly more efficient machine code while maintaining high compilation speeds. Biased Locking: This optimized uncontended synchronization by eliminating atomic operations when a monitor is locked by only one thread—dramatically boosting performance on multiprocessor machines. Scripting Integration (JSR 223): Java 6 was the first version to allow dynamic scripting languages (like the bundled Rhino JavaScript engine) to co-exist seamlessly with Java code. ⚡ A Massive Performance Leap The architectural changes translated into "startling" out-of-the-box speed improvements without requiring code changes. 45% Faster Execution: Benchmarks showed the new client compiler executed the popular SPECjvm98 suite 45% faster than its predecessor. 40% Better Compilation Speed: The redesigned back end generated better code in less time compared to Java 5. Desktop Responsiveness: Improvements to Swing included true double-buffering (eliminating "gray-area" effects) and crisp LCD text rendering via sub-pixel font aliasing. Java SE 6 proved that a compiler focused on startup and responsiveness could still deliver peak performance that narrowed the gap with heavy-duty server compilers. What are your memories of working with Java 6? Let’s discuss in the comments! 👇 #Java #SoftwareEngineering #JVM #TechHistory #Programming #HotSpot #SoftwareArchitecture #JavaSE6
To view or add a comment, sign in
-
-
A Marker Interface 👇 A Marker Interface in Java is an interface that contains no methods or fields. It is used to mark a class so that the Java runtime or compiler can identify some special behavior or capability of that class. Example: Here, Serializable has no methods but if a class implements it, Java knows that objects of that class can be serialized. 🔹A Marker Interface (also known as a Tagging Interface) is a design pattern in Java where an interface contains no methods or constants. If you look at the source code of a marker interface, it’s just an empty shell: Java public interface MyMarkerInterface { // Absolutely nothing here } Why use an empty interface? The purpose isn't to define behavior (like a normal interface does), but to deliver a message to the JVM or a framework. It acts like a "stamp" or a "label" on a class. When a class implements a marker interface, it's telling the runtime: "I have a special property. You can treat me differently." 🌟 How It Works (The "Metadata" Approach) Since the interface is empty, the class implementing it doesn't have to write any new code. Instead, other parts of the system use the instanceof operator to check for the "stamp." 🔹The Logic: Class A implements Serializable. ✔ The JVM sees a request to save Class A to a file. ✔ The JVM checks: if (A instanceof Serializable). ✔ If True: The JVM proceeds with the specialized logic to save the data. ✔ If False: The JVM throws a NotSerializableException. Famous Examples in Java 🔹 Serializable: Tells the JVM that the object’s state can be converted into a byte stream (saved to a file or sent over a network). 🔹Cloneable: Tells the Object.clone() method that it is legal to make a field-for-field copy of instances of that class. 🔹Remote: Used in RMI (Remote Method Invocation) to identify interfaces whose methods may be invoked from a non-local virtual machine. I’m truly thankful to my mentor for their valuable guidance Anand Kumar Buddarapu Saketh Kallepu Uppugundla Sairam #Java #CoreJava #MarkerInterface #JavaProgramming #OOP #Serializable #Cloneable #JavaConcepts #Programming #Developers
To view or add a comment, sign in
-
-
Hello everyone! 👋 Day 5 of my deep dive into core Java fundamentals! ☕ Today, I explored Type Conversions, specifically answering a crucial question: What is the actual difference between Implicit and Explicit conversions in Java? 🤔 If you think of computer memory as physical boxes, it makes perfect sense! Here is how Java handles moving data between different sized containers: 🟢 1. Implicit Conversion (The Automatic Upgrade) This is also known as a "Widening Conversion". It happens when you move data from a smaller data type (like an 8-bit byte) into a wider/larger data type (like a 32-bit int). Because what fits in a small box will easily fit into a massive box, Java does this completely automatically. You just write int i = b; and the compiler handles it behind the scenes without complaining. 🔴 2. Explicit Conversion (The Manual Override) This is known as a "Narrowing Conversion". This happens when you try to go backwards—stuffing a large container into a smaller one. For example, trying to put a 32-bit int into an 8-bit byte. If you try to do this automatically, Java will throw a compile-time error. Why? Because the compiler is terrified that your data will get chopped off (truncated) during the squeeze! To make it happen, you have to use Type Casting. You have to manually write the target type in brackets, like b = (byte) i;, to explicitly tell Java: "I know the risks, do it anyway!". 🧠 The "Under the Hood" Mindblower: I ran an experiment today: what actually happens if you cast a massive int of 300 into a tiny byte container? Since a byte can only hold up to 127, it obviously overflows. But it doesn't crash! Instead, Java looks at the 32-bit binary representation of 300 and literally chops off the extra bits, keeping only the 8 bits that fit. A massive shortcut I learned: To figure out what number you will end up with, you can just take your number and use the modulo operator against the maximum range of a byte (256). So, 300 % 256 means our new byte will store exactly 44! Understanding how the JVM aggressively protects our memory from data loss makes its strict rules feel so much more logical. 🛡️ #Java #SoftwareEngineering #TypeCasting #TechFundamentals #StudentDeveloper #InterviewPrep #CodingJourney
To view or add a comment, sign in
-
-
🚀 Day 35 – Core Java | Super Keyword, Method Types in Inheritance & Access Modifiers Today’s session connected multiple important concepts in Java Inheritance and clarified how classes interact with each other in real programs. 🔹 Super Keyword When both parent and child classes have the same variable or method, Java gives priority to the child class. To access the parent class version, Java provides the super keyword. Example: super.variableName super.methodName() ✔ Used to access parent variables ✔ Used to call parent methods Important difference: super() → used for constructor chaining super keyword → used to access parent properties and behaviors 🔹 Constructor Chaining Recap Constructor chaining can happen in two ways: 1️⃣ Within the same class this() 2️⃣ Between parent and child classes super() Important rule: Both this() and super() must be the first line of a constructor, so they cannot be used together in the same constructor. 🔹 Types of Methods in Inheritance In inheritance, methods fall into three categories: 1️⃣ Inherited Methods Methods that the child class directly acquires from the parent without any modification. Example: takeoff() land() 2️⃣ Overridden Methods Methods that the child class inherits and then modifies. Example: fly() Each plane type flies differently. Java uses: @Override This annotation helps: Documentation Detecting coding mistakes 3️⃣ Specialized Methods Methods created only in the child class. Example: carryCargo() carryPassengers() carryWeapons() These methods do not exist in the parent class. 🔹 Real Example Used in Class We designed a Plane system using inheritance. Parent Class: Plane Methods: takeoff() fly() land() Child Classes: CargoPlane PassengerPlane FighterPlane Each child: inherits takeoff() and land() overrides fly() adds specialized methods This demonstrated how code reuse reduces development effort. 🔹 Access Modifiers in Java To understand inheritance properly, we also explored Access Modifiers. Key observation: Public → Maximum visibility Private → Minimum visibility Visibility decreases in this order: public → protected → package access → private 💡 Biggest Takeaway Understanding inheritance is not just about writing extends. It requires clarity about: Constructor chaining Method overriding Code reuse Access control Class relationships These concepts are fundamental before moving to the next pillar of OOP – Polymorphism. #Day35 #CoreJava #Inheritance #SuperKeyword #MethodOverriding #JavaOOP #AccessModifiers #DeveloperJourney
To view or add a comment, sign in
-
-
Want to Level Up Your Java Game? Let's Talk JVM! 🚀 Ever wondered what makes Java tick behind the scenes? 🧐 It’s not just a language; it's an entire ecosystem, and the heart of it all is the Java Virtual Machine (JVM). 💓 Understanding the JVM is like knowing how your car's engine works—it makes you a better driver, or in our case, a better developer! 👩💻👨💻 Think of the JVM as Java’s interpreter and bodyguard. It’s what gives Java its superpower: "Write Once, Run Anywhere." 🌍 Here's a quick, breakdown of how it pulls off the magic. ✨ Your Code's Epic Journey: 1️⃣ Class Loader Subsystem: This is the JVM's "receptionist." It reads your .class files (compiled Java bytecode) and loads them into memory. It also takes care of linking and initialising things so they're ready to go. 🧑✈️ 2️⃣ Runtime Data Areas (Memory): This is where all the action happens! 🏗️ It's divided into key zones: * Method Area: Stores class information and static variables. Think of it as the project blueprint repository. 📂 * Heap: The big arena where all your objects live. 🏟️ This is shared space, and it's where the Garbage Collector does its work. * JVM Stack: Per-thread, private storage for method calls and local variables. Think of it as a personal notebook for each process. 💪 * PC Register: Keeps track of exactly where each thread is in the execution process. The ultimate bookmark! 🔖 * Native Method Stack: Dedicated space for non-Java (native) code. 🌐 3️⃣ Execution Engine: The engine room! 🚂 It takes that bytecode and turns it into real, executable commands. This is where you find the performance boosters: * Interpreter: Executes bytecode line by line, fast for getting things started. ⚡️ * JIT (Just-In-Time) Compiler: The performance wizard. 🧙♂️ It finds the "hot spots" in your code and compiles them directly into native machine code for maximum speed. * Garbage Collector (GC): Your code's janitor. 🧹 It automatically finds and frees up memory occupied by objects you're no longer using, preventing memory leaks and keeping things running smoothly. So, next time you run a Java application, remember the incredibly sophisticated JVM working tirelessly to make it happen! ⚙️ What's your favourite part of JVM architecture? Let me know in the comments! 👇 #Java #JVM #SoftwareEngineering #TechInfluencer #CloudComputing #CodingLife #LearnToCode #JavaDeveloper #TechTutorials #ProgrammerInsights #JVMInternal #PerformanceOptimization
To view or add a comment, sign in
-
-
🚀 Day 21 – Java Full Stack Journey | Arrays Deep Dive (Objects, Limitations & Memory Reality) Today’s session completely changed the way I look at Arrays in Java. We didn’t just learn arrays — We understood their power, limitations, memory behavior, and real-world relevance. 🔹 1️⃣ Can Arrays Store Objects? Until now, we stored: int float char boolean All primitive types. But today’s key learning: 👉 Arrays can store objects too. Example: Student[] arr = new Student[3]; Then storing objects: arr[0] = s1; arr[1] = s2; arr[2] = s3; Important Insight: Array stores references Default value for object array → null Multiple references can point to the same object Changes reflect everywhere (Pass by Reference concept) This strengthened my understanding of Heap & Stack memory behavior. 🔹 2️⃣ Arrays are Homogeneous A Student[] can only store Student objects. You cannot store a Customer object inside it. Same rule applies for primitives: int[] arr = new int[5]; arr[2] = 99.9; // ❌ Not allowed ✔ Arrays only store same data type ✔ Strict type safety 🔹 3️⃣ Fixed Size – Major Limitation Once created: int[] arr = new int[5]; Size is permanent. Cannot grow Cannot shrink Trying: arr[5] = 60; Results in: 👉 ArrayIndexOutOfBoundsException One small index mistake → Runtime error. 🔹 4️⃣ Contiguous Memory – Hidden Drawback Arrays require contiguous memory allocation. But RAM works in a dispersed way. If large continuous memory is unavailable → You may get OutOfMemoryError This is one reason why advanced data structures exist. 🔹 5️⃣ Multiple Ways to Declare Arrays Valid ways: int[] a; int a[]; int[][] a; int a[][]; But ❌ Not allowed: []int a; Rule: Dimension brackets must come after the data type. 🔹 6️⃣ Direct Initialization (Shortcut) Instead of: int[] arr = new int[3]; arr[0] = 10; arr[1] = 20; arr[2] = 30; You can directly write: int[] arr = {10, 20, 30}; Cleaner. Faster. More readable. Same works for: 2D arrays 3D arrays Jagged arrays 🔹 7️⃣ Regular vs Jagged Arrays Regular → Equal column size Jagged → Variable column size Jagged arrays are memory efficient. Also learned: 👉 There is no “Jagged 1D Array” Because 1D cannot vary row length. 💡 Biggest Realization Today Arrays are powerful but limited. They: ✔ Store large structured data ✔ Provide index-based fast access But: ❌ Fixed size ❌ Homogeneous only ❌ Contiguous memory requirement This is why Java later introduces: 👉 Collections Framework Every day the foundation is getting stronger. From variables → methods → objects → arrays → memory understanding. Building step by step. 🚀 Day 21 Complete ✔ #Day21 #Java #CoreJava #Arrays #OOPS #MemoryManagement #DataStructures #FullStackJourney #LearningInPublic #JavaDeveloper TAP Academy
To view or add a comment, sign in
-
-
🚀 Day 19 – Java Full Stack Journey | Arrays in Depth (1D, 2D, 3D + length Property) Today’s session was a complete deep dive into Arrays in Java — not just creating them, but truly understanding: • Memory behavior • Traversal logic • Why loops are mandatory • How length actually works • Regular vs Jagged arrays 🔹 What is an Array? 👉 Arrays are objects in Java 👉 Stored in the Heap memory 👉 Used to store homogeneous data 👉 Indexed starting from 0 When you print the array reference directly: System.out.println(a); You don’t get elements. You get the address reference — because arrays are objects. To access elements → Traversal using loops is mandatory. 🔹 1️⃣ One-Dimensional Array (1D) int[] a = new int[5]; ✔ Stored in Heap ✔ Default values → 0 ✔ Traversed using single loop Important rule: for(int i = 0; i < a.length; i++) Using a.length makes your code dynamic. Never hardcode size like i < 5. 🔹 2️⃣ Two-Dimensional Array (2D) int[][] a = new int[2][5]; Meaning: 2 rows 5 columns Traversal requires nested loops: for(int i = 0; i < a.length; i++) { for(int j = 0; j < a[i].length; j++) { // Access element } } Important Understanding: a.length → number of rows a[i].length → number of columns in that row This makes the code scalable and flexible. 🔹 3️⃣ Three-Dimensional Array (3D) int[][][] a = new int[2][3][5]; Meaning: 2 blocks 3 rows per block 5 columns per row Traversal requires 3 nested loops: for(int i = 0; i < a.length; i++) { for(int j = 0; j < a[i].length; j++) { for(int k = 0; k < a[i][j].length; k++) { // Access element } } } Understanding flow: Column moves fastest → Then row → Then block That’s how memory gets populated. 🔹 Regular Array vs Jagged Array ✔ Regular Array → All rows have equal number of columns ✔ Looks rectangular Tomorrow’s focus → Jagged Array (Where each row can have different column size) 🔹 Most Important Learning Today Arrays are not about syntax. They are about: • Understanding object behavior • Understanding memory (Heap & Stack) • Writing dynamic loops • Avoiding hardcoded logic • Thinking in dimensions 90% of array problems follow the same pattern: Create → Traverse → Process → Print Once traversal is clear, logic becomes easy. Consistency + Practice + Typing the code yourself = Mastery. Day 19 Complete ✔ #Day19 #Java #CoreJava #Arrays #DataStructures #JVM #FullStackJourney #LearningInPublic #JavaDeveloper #100DaysOfCode TAP Academy
To view or add a comment, sign in
-
-
DAY 18: CORE JAVA TAP Academy 🚀 Understanding Method Overloading in Java Method Overloading is one of the core concepts of Compile-Time Polymorphism in Java. It allows a class to have multiple methods with the same name but different parameter lists. Let’s break down how method overloading is observed and identified 👇 🔹 1. Method Name The method name must be the same. Example: add() can have multiple definitions within the same class. 🔹 2. Number of Parameters If the number of parameters is different, the method is overloaded. int add(int a, int b) int add(int a, int b, int c) 🔹 3. Type of Parameters Even if the number of parameters is the same, changing the data type makes it overloaded. int add(int a, int b) double add(double a, double b) 🔹 4. Order of Parameters If parameter types are the same but in a different order, it is still valid overloading. void display(int a, String b) void display(String b, int a) 🔹 5. Type Conversion (Implicit Casting) Java follows method matching rules: Exact match Widening (int → long → float → double) Autoboxing Varargs Example: void show(int a) void show(double a) If we call show(5), Java chooses the most specific match (int). 🔹 6. Ambiguity in Method Overloading Ambiguity occurs when Java cannot determine which method to call. Example: void test(int a, float b) void test(float a, int b) Calling test(10, 10) creates confusion because both methods are possible after type conversion. ⚠️ The compiler throws an error in such cases. 📌 Important Terms Related to Method Overloading ✔️ Compile-Time Polymorphism ✔️ Static Binding ✔️ Early Binding ✔️ Method Signature (method name + parameter list) ✔️ Implicit Type Promotion ✔️ Varargs ✔️ Autoboxing 💡 Key Rule to Remember Changing only the return type does NOT achieve method overloading. int sum(int a, int b) double sum(int a, int b) ❌ (Invalid) ✨ Method overloading improves code readability, flexibility, and reusability. It allows developers to perform similar operations in different ways without changing method names. Mastering this concept is essential for cracking Java interviews and writing clean object-oriented code. #Java #OOPS #Programming #SoftwareDevelopment #Coding #LearningJourney
To view or add a comment, sign in
-
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development
Great progress Ullas C K! Love seeing people invest in learning Java and growing their skills. If you’re looking for structured practice, feel free to check out our free course: https://www.javapro.academy/bootcamp/the-complete-core-java-course-from-basics-to-advanced/ Keep up the awesome work!