
This course includes our updated coding exercises so you can practice your skills as you learn.
See a demo
Overview of course and what will be covered
Goals and objectives of the course
Prerequisites and recommended background knowledge
Course materials and resources
Introduction to the Java programming language and its importance in the industry
Installing the Java Development Kit (JDK)
Configuring the JDK and setting the JAVA_HOME environment variable
Installing the Java Development Kit (JDK)
Common errors that may occur while setting up the development environment
How to troubleshoot and resolve these errors
Creating a new Java file
Understanding the structure of a Java program and the role of the main method
Writing code for a simple console program
Compiling .java files to bytecode
Running the program from the command line
Creating a new Java file
Understanding the structure of a Java program and the role of the main method
Writing code for a simple console program
Compiling .java files to bytecode
Running the program from the command line
Definition and purpose of IDEs
Comparison of IDEs to text editors
Importance of using an IDE in Java development
Popular IDEs for Java development
Downloading and installing IntelliJ IDEA
Creating a new project in the IntelliJ IDEA
Writing and executing a simple Java program
Explanation of what data types and variables are
Importance of understanding data types and variables in programming
Explanation of primitive data types and their uses
Integer data types (byte, short, int, long)
Floating-point data types (float, double)
Character and boolean data types
Demonstration of how to declare and initialize variables of different primitive data types
Casting
Explanation of non-primitive data types (String, arrays, classes)
Comparison of primitive and non-primitive data types
Demonstration of how to declare and initialize variables of non-primitive data types
Explanation of variable naming conventions in Java
Explanation of variable scope
Demonstration of how variable scope affects program behavior
Using the System.out.print() and System.out.println() methods to write to the console
Examples of writing different data types to the console
Formatting output with printf() method
Using the Scanner class to read input from the console
Examples of reading different data types from the console
Arithmetic operators (e.g. +, -, *, /)
Comparison operators (e.g. ==, !=, >, <)
Logical operators (e.g. &&, ||, !)
Assignment operators (e.g. =, +=, -=)
Understanding operator precedence in expressions
Examples of how operator precedence affects the outcome of an expression
Common mistakes when using operators and expressions
Best practices for writing clear and efficient code using operators and expressions
Syntax and usage of if-else statements
Example of if-else statements in Java code
Nesting of if-else statements
Syntax and usage of switch statements
Example of switch statements in Java code
Differences between switch and if-else statements
Types of loops in Java (for, while, do-while)
Syntax and usage of each loop type
Examples of loops in Java code
Usage of break and continue
Tips for efficient looping
Definition of a method in Java
Syntax of declaring a method in Java
Types of methods (void, non-void)
Defining parameters for a method
Return types of methods
Method overloading
Method invocation
Parameter passing mechanism in Java
Recursive methods
Varargs in the methods
Creating and initializing arrays
Accessing and modifying array elements
Iterating through arrays
Common methods for arrays (length, sort, etc.)
Multidimensional arrays
Overview of the concept of strings in Java
Differences between string literals and string objects
String methods such as length(), charAt(), indexOf()
Immutability of strings and its implications
Using the + operator for concatenation
Using the StringBuilder and StringBuffer classes for concatenation
Compare strings using the equals() and equalsIgnoreCase() methods
Compare strings using the == operator and the compareTo() method
Syntax and usage of the String.format() method
Examples of formatting strings using placeholders and format specifiers
Understanding of string pool concept
How string pool works in Java
Definition and explanation of a class in Java
Creating a class and understanding its structure
Fields
Methods
Definition and explanation of an object in Java
Creating an object from a class
Understanding the relationship between classes and objects
Using the dot operator to access object methods and variables
Understanding the difference between an object's reference and its value
'static' keyword
Access modifiers
Initialization blocks
Nested classes
Getters and setters
Definition and explanation of constructors in Java
Types of constructors: default and parameterized
'this' keyword
How constructors are used when creating objects
Overview of interfaces in Java
Defining an interface
Implementing an interface
Extending an interface
Default and static methods in interfaces
Overview of abstract classes in Java
Defining an abstract class
Extending an abstract class
Abstract methods and concrete methods
Abstract classes vs concrete classes
Differences between interfaces and abstract classes
When to use interfaces and when to use abstract classes
Extending an abstract class and implementing an interface
Differences between "implements" and "extends"
Definition and explanation of inheritance in OOP
Examples of inheritance in real-world scenarios
How inheritance allows for code reuse and organization
Extending classes in Java
Understanding the relationship between parent and child classes
Overriding methods in child classes
Understanding the use of the "super" keyword
Understanding the "is-a" relationship in inheritance
Definition and explanation of polymorphism in OOP
How polymorphism allows for flexibility and dynamic behavior in code
Understanding the difference between overloading and overriding methods
Examples of polymorphism in use, such as with the "instanceof" operator
Understanding the use of the "final" keyword in classes and methods
Understanding the use of the "protected" access modifier
Understanding the difference between "composition" and "inheritance"
Understanding the use of inner classes and anonymous classes in polymorphism
Understanding the use of typecasting and downcasting
Definition of Encapsulation
Explanation of how encapsulation works
Explanation of public, private, protected and default access modifiers
Use of access modifiers in classes, methods and variables
Code examples of encapsulation in practice
Explanation of the acronym SOLID and its meaning
Definition and explanation of the Single Responsibility Principle
Definition and explanation of the Open-Closed Principle
Definition and explanation of the Liskov Substitution Principle
Definition and explanation of the Interface Segregation Principle
Definition and explanation of the Dependency Inversion Principle
Explanation of how Java handles memory management
The role of the garbage collector in removing unused objects
Overview of the Collection framework
Collections hierarchy
Understanding the different types of Collections (List, Set, Queue)
ArrayList
LinkedList
ArrayList vs LinkedList
Using Lists for data manipulation and retrieval
Performance considerations for Lists
Understanding the Set interface
HashSet
TreeSet
Using Sets for data manipulation and retrieval
Understanding set operations (union, intersection, difference)
Performance considerations for Sets
Understanding the Queue interface and its implementation classes
Using Queues for data manipulation and retrieval
Understanding queue operations (offer, poll, peek)
Performance considerations for Queues
Maps hierarchy
Understanding the Map interface and its implementation classes
Using Maps for data manipulation and retrieval
Understanding map operations (put, get, remove)
Performance considerations for Maps
Using the Iterator and ListIterator interfaces
Using foreach with Collections and Maps
Using the Comparator and Comparable interfaces
Using the Collections utility class
Using the Arrays utility class.
Explanation of what exceptions are in Java
The importance of exception handling in programming
Overview of the exception class hierarchy in Java
Explanation of the Throwable class
Understanding the difference between Error and Exception
Understanding the difference between Exception and RuntimeException
Syntax and usage of the try-catch statement
How to catch and handle specific exceptions
The use of multiple catch blocks
The finally block
Syntax and usage of the throw statement
When to use the throw statement
Syntax and usage of the throws statement
When to use the throws statement
Checked vs Unchecked exceptions
Examples of common exceptions in Java
How to prevent exceptions
How to handle exceptions properly
How to avoid common mistakes when handling exceptions
Overview of custom exceptions
Reasons for creating custom exceptions
Extending the Exception or RuntimeException class
Overriding the constructors
Adding additional methods and fields
Providing meaningful error messages
Throwing exceptions at the appropriate level of abstraction
Definition and purpose of generics
How generics improves type safety and reduces code duplication
Comparison with non-generic types
Syntax for creating generic classes and methods
Using the wildcard character "?"
Bounded type parameters
Creating and using generic classes such as List<T> and Map<K, V>
Using generic methods such as Collections.sort() and Arrays.asList()
Avoid using raw types
Pay attention to type erasure
Be cautious when using generic array types
Explanation of what enumerations are and how they are used in Java
Differences between enumerations and traditional constant variables
Syntax for defining an enumeration
Examples of defining an enumeration and using its values
How to use enumerations in control flow statements (i.e. switch)
How to use enumerations in object-oriented programming
Overview of the Enum class and its methods (i.e. values(), ordinal(), name())
Examples of using the Enum class methods in code
Overview of Input/Output (IO) and file handling in Java
Understanding streams and readers/writers
Differences between byte and character streams
Reading data from input streams
Using the InputStream and Reader classes
Examples of reading from the file system, network, and user input
Writing data to output streams
Using the OutputStream and Writer classes
Examples of writing to the file system, network, and console
Definition of serialization
Why and when to use serialization
Comparison of serialization and deserialization
Implementing the Serializable interface
Using the ObjectOutputStream and ObjectInputStream classes
Controlling serialization using the transient keyword
What is Multithreading
Concurrency vs. Parallelism
Processes vs. Threads
Advantages and disadvantages of Multithreading
Creating and starting threads
Difference between start() and run() methods
Thread states and life cycle
Thread priorities and scheduling
Daemon Threads
Why synchronization is needed
Synchronized methods and blocks
Monitors, wait(), notify(), and notifyAll()
Deadlocks and how to avoid them
Interrupting threads
InterruptedException
Interrupting non-interruptible threads
Inter-thread communication
Wait-notify mechanism
Guarded Blocks
Joining threads
Introduction to the Executor framework
Executor, ExecutorService, and ThreadPoolExecutor
Executor lifecycle methods
Submitting tasks to ExecutorService
CompletableFuture in Executor framework
Introduction to the Fork/Join Framework
RecursiveTask and RecursiveAction classes
ForkJoinPool and its methods
Divide-and-conquer approach
Task stealing and work balancing
Examples of using the Fork/Join Framework
Introduction to Thread Pools
Creating and managing Thread Pools
Types of Thread Pools
ThreadPoolExecutor in detail
What is thread safety
Atomic variables and classes
Synchronized collections
Volatile keyword
Introduction to Thread Local Variables
Why are they needed
ThreadLocal class and methods
Usage examples
Introduction to Lock Framework
ReentrantLock
ReadWriteLock
Lock conditions
Introduction to Thread Groups
ThreadGroup methods and constructors
Uncaught Exception Handler
Welcome to the World of Java Programming!
Welcome to our Java Core Course! We are happy to have you here as you begin your journey into programming or grow your skills. This course is perfect for everyone—whether you’re just starting, thinking about switching careers, or simply curious about coding. You don’t need a computer science degree to join—just a desire to learn.
Why Take This Course?
At ITER Academy, we have already taught over 1,000 students in classrooms. Now, we are bringing all that knowledge and experience online, so more people can benefit. Your teacher, Andrii Partola, is a Senior Java Engineer who works with Java every day. He uses Java to create powerful and complex programs for real companies. He has taken his real-world experience and turned it into lessons that are easy to understand and fun to follow.
Who Can Learn Java with Us?
This course is made for everyone.
Complete beginners: Even if you’ve never written a single line of code, this course will guide you step by step.
Career changers: If you want to start a new career in tech, this course will give you the tools you need.
Anyone curious about programming: If you’ve always wanted to try coding, this is a great place to start.
Learn with Real-Life Examples
Learning is easier when you can see how things work. That’s why this course is full of real-life examples. You’ll see how Java is used to solve problems, so you can understand not just what you’re learning, but also why it’s useful. These examples will help you remember things better and prepare you to use Java on your own.
Quizzes to Check Your Knowledge
To make sure you really understand the material, this course includes quizzes after many lessons. These quizzes will help you review important ideas and see how much you’ve learned. They’re a fun way to test yourself and feel confident before moving on to the next topic.
Practice Coding with Exercises
The best way to learn programming is by writing code yourself. That’s why this course has lots of coding exercises. These exercises give you a chance to practice what you’ve learned and solve problems like a real programmer. By doing this, you’ll get better and more confident with every lesson.
Lessons Designed for Success
We didn’t just create this course from scratch. We studied many other popular courses to learn what works best. Every lesson in this course is carefully organized, so it’s easy to follow and makes sense step by step. Each lesson is packed with useful information, so you learn quickly without wasting time.
Free Access to All Code
All the code written in this course is available on GitHub. You can download it, use it, and practice with it whenever you need. This means you’ll always have access to examples to help you as you keep learning.
Why Choose ITER Academy?
Practical knowledge: Learn the skills that are used in real programming jobs.
Simple and clear lessons: No confusing words or hard-to-follow explanations.
Step-by-step structure: Each lesson builds on the last one, so you never feel lost.
Experienced teacher: Learn from a professional Java engineer with years of experience.
Start Learning Today
With easy-to-follow lessons, plenty of examples, quizzes, and exercises, this course gives you everything you need to become confident in Java programming. Join us today and let’s start your journey into the world of coding together!