QA-JAVA-01 Sprint Summary

Modified on Sat, 24 Jun, 2023 at 4:40 PM

Index:

  1. Operators

  2. Conditionals

  3. Arrays

  4. Loops

  5. Strings

  6. Collections

  7. Object Oriented Programming

  8. Classes

  9. Keywords

  10. Integer class

  11. Java System, Packages and Libraries

Topic 1: Operators


Logical Operators

Logical operators in Java are symbols or keywords that are used to perform logical operations on boolean values (true or false). They allow you to combine and manipulate boolean expressions to make decisions in your code.

Logical operators are used in various situations where you need to evaluate multiple conditions and make decisions based on their results. They are commonly used in control flow statements such as if statements, while loops, and for loops.

Common Logical Operators in Java:

    AND operator (&&): Returns true if both operands are true.
    Example: if (condition1 && condition2) { // do something }

    OR operator (||): Returns true if at least one of the operands is true.
    Example: if (condition1 || condition2) { // do something }

NOT operator (!): Returns the opposite boolean value of the operand.
    Example: if (!condition) { // do something }

Takeaways / Best practices:

    1. Use logical operators to combine and evaluate boolean conditions in your code.
    2. Group conditions using parentheses for clarity and to ensure the desired evaluation order.



Topic 2: Conditional Statements


If-Else Condition

If-else conditions in Java are control flow statements that allow you to execute different blocks of code based on a certain condition.

If-else conditions are widely used in Java programming to make decisions and control the flow of execution based on the evaluation of a boolean expression.

Common use of If-Else in Java:

  • An if statement is used to evaluate a condition. 

    • If the condition is true, the code block inside the if statement is executed. 

    • If the condition is false, the code block is skipped.

  • An optional else statement can follow the if statement. If the condition in the if statement is false, the code block inside the else statement is executed.

Code Snippet:

```

int num = 10;

if (num > 0) {

    System.out.println("The number is positive.");

} else if (num < 0) {

    System.out.println("The number is negative.");

} else {

    System.out.println("The number is zero.");

}


```


Takeaways / Best practices:

  • Use if-else conditions to make decisions based on conditions

  • Ensure that the condition in the if statement evaluates to a boolean value (true or false

  • Pay attention to the order of conditions when using else if statements, as they are evaluated sequentially.

Nested If-Else Condition

Nested if-else conditions in Java refer to the usage of an if-else statement inside another if-else statement, allowing for more complex decision-making based on multiple conditions.

Nested if-else conditions are used when you need to evaluate additional conditions within a specific branch of an if-else statement.

Common use of Nested If-Else in Java:

  • An outer if statement is used to evaluate a condition. If the condition is true, the code block inside the if statement is executed

  • Within the code block of the outer if statement, an inner if statement can be placed to evaluate an additional condition. 

    • If the condition in the inner if statement is true, the code block inside it is executed. 

    • If the condition is false, the code block inside the inner else statement (if present) is executed.


Code Snippet:

```

int num = 10;

if (num > 0) {

    System.out.println("The number is positive.");

    if (num % 2 == 0) {

        System.out.println("The number is even.");

    } else {

        System.out.println("The number is odd.");

    }

} else {

    System.out.println("The number is non-positive.");

}

```

Takeaways / Best practices:

  • Use nested if-else conditions when you need to evaluate additional conditions within a specific branch of an if-else statement

  • Ensure proper indentation and formatting to enhance code readability, especially when dealing with multiple levels of nesting.

Switch Statement

A switch statement in Java is a control flow statement used to select and execute a block of code from multiple options based on the value of an expression.

Switch statements are commonly used when you have a single expression that you want to compare against multiple possible values.

Here's how a switch statement is typically used:

  • Declare a switch statement using the switch keyword, followed by the expression to be evaluated

  • Define multiple case statements within the switch block, each representing a specific value that the expression can take

  • Write the code to be executed for each case within the corresponding case block

  • Optionally, include a default case to specify the code to be executed when none of the previous cases match the expression value

  • Terminate each case block with the break statement to prevent fall-through to subsequent cases.


Code snippet:

```

int day = 3;

String dayName;

switch (day) {

    case 1:

        dayName = "Monday";

        break;

    case 2:

        dayName = "Tuesday";

        break;

    case 3:

        dayName = "Wednesday";

        break;

    case 4:

        dayName = "Thursday";

        break;

    case 5:

        dayName = "Friday";


        break;

    default:

        dayName = "Invalid day";

        break;

}

System.out.println("The day is: " + dayName);


```


Takeaways / Best practices


  • Use switch statements when you have a single expression to compare against multiple possible values

  • Include a default case to handle unexpected or unmatched values

  • Use the break statement to prevent fall-through to subsequent cases


Topic 3: Arrays


Arrays in Java

Arrays in Java are data structures that store a fixed-size sequence of elements of the same type, allowing efficient access and manipulation of the elements.

Arrays are commonly used when you need to work with a collection of elements of the same type, such as a list of numbers, strings, or objects.

Here's how arrays are typically used in Java:


  • Declare an array by specifying the type of elements it will hold, followed by square brackets ([]) and the array name

  • Initialize the array by assigning it a specific size using the new keyword, followed by the type and the size within square brackets

  • Assign values to individual elements of the array using indexing, where the first element has an index of 0

  • Access the elements of the array using indexing, and perform operations or retrieve values as needed

  • Iterate over the elements of the array using loops, such as the for loop or the enhanced for loop

  • Utilize various array methods, such as length to determine the size of the array and Arrays.toString() to obtain a string representation of the array.


Code snippet:

```

int[] numbers = new int[5];

numbers[0] = 10;

numbers[1] = 20;

numbers[2] = 30;

numbers[3] = 40;

numbers[4] = 50;

System.out.println("Array length: " + numbers.length); //OUTPUT- Array length: 5

for (int i = 0; i < numbers.length; i++) {

    System.out.println("Element at index " + i + ": " + numbers[i]);

}

```

Takeaways / Best practices

  • Declare the array with the appropriate type and size

  • Initialize the array before accessing or modifying its elements

  • Be cautious with array indices to avoid index out-of-bounds errors

  • Use loops to iterate over array elements efficiently


2D-Arrays

A 2D array in Java is a data structure that represents a matrix or grid of elements arranged in rows and columns.

2D arrays are used when you need to work with a table-like structure or when you have data that can be organized in a two-dimensional grid.

Here's how a 2D array is typically used in Java:

  • Declare a 2D array by specifying the type of elements it will hold, followed by square brackets ([][]) and the array name

  • Initialize the 2D array by providing the dimensions (number of rows and columns) using the new keyword

  • Assign values to individual elements of the 2D array using row and column indices

  • Access the elements of the 2D array using row and column indices, and perform operations or retrieve values as needed

  • Iterate over the elements of the 2D array using nested loops, such as the nested for loop

  • Utilize the length property of the array to determine the size of the rows and columns.

Code snippet:

```

int[][] matrix = new int[3][3];

matrix[0][0] = 1;

matrix[0][1] = 2;

matrix[0][2] = 3;

matrix[1][0] = 4;

matrix[1][1] = 5;

matrix[1][2] = 6;

matrix[2][0] = 7;

matrix[2][1] = 8;

matrix[2][2] = 9;

System.out.println("Element at (1, 1): " + matrix[1][1]);

for (int i = 0; i < matrix.length; i++) {

    for (int j = 0; j < matrix[i].length; j++) {

        System.out.print(matrix[i][j] + " ");
    }

    System.out.println();

}

/*

OUTPUT-

1 2 3

4 5 6

7 8 9

*/

```

Takeaways / Best practices:

  • Declare and initialize the 2D array with the appropriate dimensions

  • Assign values to individual elements using row and column indices

  • Access and manipulate elements using row and column indices

  • Use nested loops to iterate over the elements of the 2D array

  • Be cautious with array indices to avoid index out-of-bounds errors

  • Utilize the length property to determine the size of the rows and columns

Topic 4: Loops


For Loops

A for loop in Java is a control flow statement used to repeatedly execute a block of code a specific number of times or iterate over elements in a collection.

For loops are used when you know the exact number of iterations or when you need to traverse through a sequence of elements.

Here's how a for loop is typically used in Java


  • Declare and initialize a loop variable.

  • Specify the condition for executing the loop, which is evaluated before each iteration. If the condition is true, the loop continues; otherwise, it terminates

  • Define the update statement that modifies the loop variable after each iteration

  • Write the code block to be executed within the for loop.

Code snippet:

```

for (int i = 1; i <= 5; i++) {
  
  System.out.println("Iteration: " + i);

}

```

Takeaways / Best practices:

  • Use a for loop when you know the number of iterations or need to iterate over a collection

  • Declare the loop variable within the for loop's initialization statement

  • Specify the loop condition to determine when the loop should terminate

  • Include the update statement to modify the loop variable after each iteration

Break & Continue Statements

Break and continue statements in Java are control flow statements used to alter the flow of execution within loops (for, while, and do-while).

Break statement:

  • Used to terminate the loop or switch statement prematurely

  • It is used when you want to exit a loop or switch statement before its normal completion

  • When encountered, the control flow immediately exits the loop or switch statement, and the program continues executing the next statement after the loop or switch.

Continue statement:

  • Used to skip the rest of the loop iteration and move to the next iteration

  • It is used when you want to bypass the remaining code in the current iteration and proceed to the next iteration of the loop

  • When encountered, the control flow jumps to the next iteration of the loop without executing the remaining code within the loop body.

Code snippet for break and continue:

```

for (int i = 1; i <= 5; i++) {
   
 if (i == 3) {

        break; // Terminates the loop when i equals 3

    }

    System.out.println("Iteration: " + i);

}

for (int i = 1; i <= 5; i++) {

    if (i == 3) {

        continue; // Skips the current iteration when i equals 3

    }

    System.out.println("Iteration: " + i);
}


```


Takeaways / Best practices:

  • Use the break statement when you want to exit a loop or switch statement prematurely

  • Use the continue statement when you want to skip the rest of the current iteration and move to the next iteration of the loop

  • Be cautious with the usage of break and continue statements to ensure they are applied appropriately, as misuse can lead to unexpected or undesired behavior

While Loops

A while loop in Java is a control flow statement used to repeatedly execute a block of code as long as a given condition is true.

While loops are used when the number of iterations is unknown and determined by a condition that is evaluated before each iteration.

Here's how a while loop is typically used in Java:

  • Initialize any necessary variables before entering the while loop

  • Specify the condition that determines whether the loop should continue or terminate

  • Write the code block to be executed within the while loop

  • Update the loop control variable(s) inside the loop to ensure the termination condition will eventually be met

  • Be cautious to avoid infinite loops by ensuring the termination condition will eventually become false.

Code snippet:

```

int count = 0;

while (count < 5) {

    System.out.println("Count: " + count);

    count++;

}


```



Takeaways / Best practices:

  • Use a while loop when the number of iterations is unknown and depends on a condition.
        Initialize loop control variables before the while loop

  • Specify the condition carefully to ensure the loop will eventually terminate

  • Update loop control variables inside the loop to progress towards the termination condition

  • Be cautious to avoid infinite loops by ensuring the termination condition will eventually become false.

Nested For Loop

A nested for loop in Java is a loop structure that contains another loop inside its body, allowing for iteration over multiple dimensions or nested structures.

Nested for loops are used when you need to iterate over elements in multiple dimensions, such as iterating through a 2D array or nested collections.

Here's how a nested for loop is typically used in Java:

  1. Declare and initialize the outer loop control variable

  2. Specify the condition for the outer loop to determine when it should continue or terminate

  3. Declare and initialize the inner loop control variable inside the outer loop

  4. Specify the condition for the inner loop to determine when it should continue or terminate

  5. Write the code block to be executed within the nested for loop

  6. Update the loop control variables for both the outer and inner loops to progress towards the termination conditions.


Code snippet:

```

for (int i = 1; i <= 3; i++) {
   
 for (int j = 1; j <= 3; j++) {

        System.out.println("Outer loop iteration: " + i);

        System.out.println("Inner loop iteration: " + j);

    }

}


```


Takeaways / Best practices:

  1. Use nested for loops when you need to iterate over multiple dimensions or nested structures

  2. Initialize and update the loop control variables for both the outer and inner loops


Topic 5: Strings

Strings in Java

A string in Java is a sequence of characters that represents textual data. It is a built-in data type and is widely used for storing and manipulating text in Java programs.

Strings are used in Java for various purposes, such as:

  1. Storing and manipulating text data

  2. Displaying messages or user inputs

  3. Working with file paths or URLs

  4. Interacting with databases and external systems.

Here's how strings are typically used in Java:

  1. Declare a string variable by specifying the data type as String

  2. Assign a value to the string variable using either a string literal or by invoking the String class constructor

  3. Use various string methods to perform operations like concatenation, comparison, substring extraction, length calculation, etc

  4. Strings can be concatenated using the + operator


Code snippet:


String message = "Hello, World!"; // String declaration and assignment

System.out.println(message); // Output: Hello, World!

String firstName = "John";

String lastName = "Doe";

String fullName = firstName + " " + lastName; // String concatenation

System.out.println(fullName); // Output: John Doe


Takeaways / Best practices:

  1. Strings are widely used for handling text data in Java

  2. Use the String class to declare and manipulate strings

  3. Strings in Java are immutable, meaning they cannot be changed once created.

String Concatenation

String concatenation in Java refers to the process of combining multiple strings together to create a new string.

String concatenation is used when you need to merge strings to form a larger string, such as creating dynamic messages, generating output, or constructing file paths.

Here's how string concatenation is typically done in Java:

  1. Use the concatenation operator (+) to join two or more strings together

  2. Place the concatenation operator between the strings that you want to combine

  3. The order of the strings determines the order in which they will appear in the resulting concatenated string

  4. You can also concatenate strings with other data types by implicitly converting them to strings using their toString() method or using the valueOf() method explicitly.


Code snippet:

```

String firstName = "John";

String lastName = "Doe";

String fullName = firstName + " " + lastName;

System.out.println("Full Name: " + fullName);

int age = 30;

String message = "My name is " + fullName + " and I am " + age + " years old.";

System.out.println(message);

```


Takeaways / Best practices:

  1. Use the concatenation operator (+) to join strings together

  2. Be mindful of spaces or separators needed between concatenated strings by including them as part of the concatenation.

String Comparison

String comparison in Java refers to the process of comparing two strings to determine their relative order or equality. It is used to check if two strings are equal or to determine the lexicographical ordering of strings.

String comparison is used in various scenarios, including:

  1. Validating user input or verifying expected values

  2. Sorting strings in ascending or descending order

  3. Implementing search algorithms or data structures that require string comparison.

Here's how string comparison is typically done in Java:

  1. Use the equals() method to check if two strings have the same content

  2. The equals() method returns a boolean value (true if the strings are equal, false otherwise

Code snippet:

```

String str1 = "apple";

String str2 = "banana";

boolean isEqual = str1.equals(str2); // String equality check

System.out.println("Are the strings equal? " + isEqual);


```

Takeaways / Best practices:

  1. Use the equals() method for string equality checks

  2. Be mindful of case sensitivity when using string comparison methods. Consider using equalsIgnoreCase() for case-insensitive comparisons.

StringBuilder Class


What is it?


StringBuilder in Java is a mutable sequence of characters, which is used for creating and manipulating dynamic string data.


Where is it used?


  1. It's typically used in situations where you need to make numerous modifications to strings of characters. 

  2. This could be anything from appending, inserting, replacing, or deleting characters or substrings within a string.


How is it used?


  1. Declare a StringBuilder instance: StringBuilder sb = new StringBuilder();

  2. Use append() to add characters or strings: sb.append("Hello, ");

  3. Further modify the StringBuilder: sb.append("World!");

  4. Convert the StringBuilder back to a String when needed: String str = sb.toString();


Code Snippet:


```

StringBuilder sb = new StringBuilder();



sb.append("Hello, ");


sb.append("World!");



String str = sb.toString();


System.out.println(str); // Prints: Hello, World!

```


Takeaways / best practices


  1. StringBuilder is much more efficient than String when doing numerous string modifications. 

    • This is because String objects are immutable in Java, meaning each time you modify a String, a new object is created, which can lead to a significant performance hit if modifications are frequent.

  2. Always convert your StringBuilder back to a String if you need to pass it to a method that expects a String. This is because StringBuilder and String are not interchangeable.

Topic 6: Collections


ArrayList

ArrayList in Java is a dynamic array-like data structure that allows storing and manipulating a collection of elements. It provides a flexible way to store and access objects of any type.

ArrayList is commonly used in the following scenarios:

  1. When the size of the collection is not known in advance and needs to grow or shrink dynamically

  2. When you need to store and access a group of objects efficiently

  3. When you want to perform operations like adding, removing, or accessing elements at specific positions in the list.

Here's how ArrayList is typically used in Java:

  1. Declare an ArrayList by specifying the type of objects it will hold within angle brackets, followed by the variable name

  2. Create an instance of ArrayList using the new keyword or by invoking the ArrayList constructor

  3. Add elements to the ArrayList using the add() method

  4. Access elements by their index using the get() method

  5. Modify elements by their index using the set() method

  6. Remove elements by their index or by the object itself using the remove() method

  7. Check the size of the ArrayList using the size() method

  8. Iterate over the elements using for-each loop or the Iterator interface

  9. Use other utility methods like contains(), indexOf(), isEmpty(), etc., to perform common operations.


Code snippet:

```

import java.util.ArrayList;

// Declare and create an ArrayList of Strings

ArrayList<String> fruits = new ArrayList<>();

// Add elements to the ArrayList

fruits.add("Apple");

fruits.add("Banana");

fruits.add("Orange");

// Access an element by index

String firstFruit = fruits.get(0);

System.out.println("First fruit: " + firstFruit);

// Modify an element by index

fruits.set(1, "Mango");

// Remove an element by index

fruits.remove(2);

// Check the size of the ArrayList

int size = fruits.size();

System.out.println("Size of the list: " + size);

// Iterate over the elements

for (String fruit : fruits) {

    System.out.println(fruit);

}

```

Takeaways / Best practices:

  1. ArrayList provides a flexible way to store and manipulate a collection of elements.

  2. ArrayList dynamically grows or shrinks based on the number of elements added or removed.

HashMaps

HashMap in Java is a data structure that stores key-value pairs and provides efficient retrieval and insertion operations. It allows you to associate a value with a unique key, enabling fast access to values based on their corresponding keys.

HashMap is commonly used in the following scenarios:

  1. When you need to store and retrieve data based on a unique identifier (key

  2. When you want to perform operations like adding, removing, or accessing elements in constant time complexity

  3. When you need a flexible data structure that can dynamically grow or shrink based on the number of elements.

Here's how HashMap is typically used in Java


  1. Declare a HashMap by specifying the types of the key and value within angle brackets, followed by the variable name

  2. Create an instance of HashMap using the new keyword or by invoking the HashMap constructor

  3. Add key-value pairs to the HashMap using the put() method

  4. Retrieve a value by its key using the get() method

  5. Remove a key-value pair using the remove() method

  6. Check if a key exists in the HashMap using the containsKey() method



Code snippet:

```

import java.util.HashMap;

// Declare and create a HashMap with Integer keys and String values

HashMap<Integer, String> students = new HashMap<>();

// Add key-value pairs to the HashMap

students.put(1, "Alice");

students.put(2, "Bob");

students.put(3, "Charlie");

// Retrieve a value by its key

String bob = students.get(2);

System.out.println("Student with key 2: " + bob);

// Remove a key-value pair

students.remove(3);

// Check if a key exists in the HashMap

boolean hasKey = students.containsKey(3);

System.out.println("Has key 3: " + hasKey);



```


Takeaways / Best practices


  1. HashMap provides efficient storage and retrieval of key-value pairs

  2. Choose appropriate key types that provide uniqueness and good hashing properties

  3. Use the put() method to add key-value pairs and the get() method to retrieve values based on keys

  4. Use the remove() method to delete key-value pairs

HashSets

HashSet in Java is a collection that stores unique elements, providing efficient membership testing and insertion operations. It does not guarantee the order of elements and allows only one null element.

HashSet is commonly used in the following scenarios:

  1. When you need to store a collection of elements without duplicates

  2. When you want to perform operations like adding, removing, or checking the presence of elements in constant time complexity

  3. When the order of elements is not important.


Here's how HashSet is typically used in Java:

  1. Declare a HashSet by specifying the type of elements within angle brackets, followed by the variable name

  2. Create an instance of HashSet using the new keyword or by invoking the HashSet constructor

  3. Add elements to the HashSet using the add() method

  4. Check if an element exists in the HashSet using the contains() method

  5. Remove an element from the HashSet using the remove() method.


Code snippet:

```

import java.util.HashSet;

// Declare and create a HashSet of Strings

HashSet<String> fruits = new HashSet<>();

// Add elements to the HashSet

fruits.add("Apple");

fruits.add("Banana");

fruits.add("Orange");

// Check if an element exists

boolean containsApple = fruits.contains("Apple");

System.out.println("Contains Apple: " + containsApple); //OUTPUT- Contains 

Apple: true


// Add same element again

fruits.add("Orange");

System.out.println(fruits.size()); //OUTPUT- 3 (remains the same)


// Remove an element

fruits.remove("Banana");

```


Takeaways / Best practices:

  1. HashSet stores unique elements, eliminating duplicates automatically

  2. Use generics to specify the type of elements that the HashSet will hold

  3. Consider the equality and hash code implementation of the element type for correct behavior

  4. Use the add() method to insert elements into the HashSet

  5. Use the contains() method to check if an element exists in the HashSet

  6. Use the remove() method to delete an element from the HashSet.


Topic 7: Java Keywords


Access Modifiers

Access modifiers in Java are keywords that define the accessibility of classes, variables, methods, and constructors in Java code.

  1. Access modifiers are used to control the visibility and accessibility of members within a class or across different classes

  2. They ensure encapsulation, data hiding, and maintainability of code by defining the level of access to class members.

In Java, there are four types of access modifiers:

  • Public: The member is accessible by any other class or code

  • Private: The member is only accessible within the same class

  • Protected: The member is accessible within the same class, subclasses, and classes in the same package

  • Default (no modifier): The member is accessible within the same package only.


Usage of access modifiers:

  1. Declare class members (variables, methods, constructors) with appropriate access modifiers based on their intended visibility and usage

  2. Use public access for members that need to be accessible from any part of the codebase

  3. Use private access for members that should not be accessible outside the class and are meant for internal implementation

  4. Use protected access for members that need to be accessible within the class, its subclasses, and classes in the same package

  5. Use default access when no access modifier is explicitly specified, allowing the member to be accessible within the same package.


Code snippet:

```

public class MyClass {
    
public int publicVar;

    private int privateVar;

    protected int protectedVar;

    int defaultVar;

    public void publicMethod() {

        // Code here

    }

    private void privateMethod() {

        // Code here

    }

    protected void protectedMethod() {

        // Code here

    }

    void defaultMethod() {

        // Code here

    }

}

public class Main {

    public static void main(String[] args) {

        MyClass obj = new MyClass();

        obj.publicVar = 10; // Accessible

        obj.privateVar = 20; // Not accessible

        obj.protectedVar = 30; // Accessible within the same package

        obj.defaultVar = 40; // Accessible within the same package

        obj.publicMethod(); // Accessible

        obj.privateMethod(); // Not accessible

        obj.protectedMethod(); // Accessible within the same package

        obj.defaultMethod(); // Accessible within the same package
    }

}

```

Takeaways / Best practices:

  1. Choose the appropriate access modifier to control the visibility of your class members

  2. Follow the principle of information hiding by making class members private whenever possible

  3. Use public methods as the interface to access private members, providing controlled and validated access.


"This" Keyword in Java

The "this" keyword in Java refers to the current instance of a class and is used to differentiate between instance variables and parameters or local variables within a method or constructor.

The "this" keyword is used in the following scenarios:

  1. To refer to instance variables or methods within the same class to avoid naming conflicts with local variables or method parameters

  2. To invoke one constructor from another constructor within the same class.


Here's how the "this" keyword is typically used in Java:

  1. Referring to instance variables or methods

    • Use the "this" keyword followed by a dot to access instance variables or invoke methods

    • This is often used when instance variables or method parameters have the same names


Code snippet:

```

public class Person {
    
private String name;

    public Person(String name) {

        this.name = name;

    }

    public void greet() {

        System.out.println("Hello, my name is " + this.name);

    }

}


```


Takeaways / Best practices:

  1. The "this" keyword is used to refer to the current instance of a class

  2. Use "this" to differentiate between instance variables and method parameters or local variables

  3. Use "this" when accessing instance variables or invoking methods within the same class.


Static Keyword in Java

The "static" keyword in Java is used to declare members (variables, methods, and nested classes) that belong to the class itself rather than individual instances of the class.

  • It is used to create class-level variables and methods that can be accessed without creating an object of the class


Usage of the "static" keyword:

  1. Static Variables

    • Declare a variable as static to make it shared among all instances of the class

    • Access the static variable using the class name followed by the variable name (e.g., ClassName.variableName

    • Modify the value of the static variable, and the change will be reflected in all instances

  2. Static Methods

    • Declare a method as static to make it accessible without creating an object of the class

    • Call the static method using the class name followed by the method name (e.g., ClassName.methodName() )

    • Static methods can only access other static members of the class and cannot access instance-level variables directly.


Code snippet:

```

public class MyClass {
   
 public static int staticVar;

    public int instanceVar;

    public static void staticMethod() {

        System.out.println("Static Method");

    }

    public void instanceMethod() {

        System.out.println("Instance Method");

    }

}



public static void main(String args[]){

   MyClass.staticMethod();  

   MyClass.staticVar = 5; 

// Static variables can be called without creating an instance of the class



   MyClass.instanceMethod();

   MyClass.instanceVar = 6; 

// Compilation error, as instanceVar or instanceMethod are not  static variables or methods

   
```


Takeaways / Best practices:

  1. Use the "static" keyword for variables and methods that are shared among all instances of a class or for utility methods that don't require object instantiation

  2. Be cautious when using static variables as they are shared across all instances and can lead to unintended side effects

  3. Static methods cannot access instance variables directly; they can only access other static members.



Topic 8: Classes in Java


Classes in Java

A class in Java is a blueprint or template that defines the properties and behavior of objects. It serves as a blueprint for creating instances (objects) of that class.

Classes are used in Java to create objects that encapsulate data and provide methods to operate on that data. They are the building blocks of object-oriented programming.

Here's how a class is typically used in Java:

  1. Declare a class by specifying the keyword class, followed by the class name

  2. Define the attributes (fields) that represent the data associated with the class

  3. Provide constructors to initialize the object with initial values

  4. Write methods (functions) that define the behavior and operations that can be performed on objects of the class

  5. Create objects (instances) of the class using the new keyword and the class 

  6. Access the attributes and invoke methods on the objects using the dot notation (objectName.attribute or objectName.method()).


Code snippet:

```

class Car {
    
String brand;

    String color;

    int year;

    public Car(String brand, String color, int year) {

        this.brand = brand;

        this.color = color;

        this.year = year;

    }

    public void startEngine() {

        System.out.println("Engine started for " + brand);

    }

    public void drive() {

        System.out.println("Driving the " + brand + " car");

    }

}

Car myCar = new Car("Toyota", "Red", 2021);

myCar.startEngine();

myCar.drive();

```

Takeaways / Best practices:

  1. Classes are used to encapsulate related data and behavior into objects

  2. Choose meaningful and descriptive names for classes to reflect their purpose and role in the system.


Methods in Java

A method in Java is a block of code that performs a specific task and can be called or invoked to execute that task.

Methods are used in Java to organize and encapsulate reusable code, improve code modularity, and promote code reusability.

Here's how a method is typically used in Java:

  1. Declare a method by specifying the access modifier (e.g., public, private), return type (e.g., void, int, String), method name, and parameters (if any

  2. Write the code block inside the method that defines the task or operations to be performedIf the method has parameters, provide the necessary values when calling the method

  3. Call or invoke the method by using the method name followed by parentheses. If the method has a return type, you can assign the returned value to a variable or use it in an expression

  4. The control flow transfers to the method body, executes the code inside the method, and returns back to the calling code after the method completes its execution.


Code snippet:

```

public class MathUtils {
    
public static int add(int num1, int num2) {
    
    return num1 + num2;
    
}

    public static void main(String[] args) {
    
    int result = add(5, 3);
    
    System.out.println("Addition result: " + result);
    
}

}


```


Takeaways / Best practices


  1. Methods help break down complex tasks into smaller, manageable units of code

  2. Use meaningful names for methods that reflect their purpose or the task they perform

  3. Methods can have return types (e.g., int, String) or be void (no return value).


Constructors in Java

A constructor in Java is a special method that is used to initialize objects of a class. It is called automatically when an object is created and ensures that the object is properly initialized.

Constructors are used in Java to set initial values to the instance variables of an object, perform any necessary setup tasks, and ensure the object is in a valid state upon creation.

Here's how a constructor is typically used in Java:

  1. Declare a constructor by using the same name as the class

  2. Define the parameters, if any, that are required to initialize the object

  3. Write the code block inside the constructor that initializes the instance variables or performs any necessary setup tasks

  4. When creating an object, use the new keyword followed by the constructor name and provide any required arguments

  5. The constructor is called automatically, and the object is initialized based on the constructor's code.


Code snippet:

```

public class Car {
    
String brand;

    String color;

    public Car(String brand, String color) {

        this.brand = brand;

        this.color = color;

    }

    public void startEngine() {

        System.out.println("Engine started for " + brand);

    }

    public static void main(String[] args) {

        Car myCar = new Car("Toyota", "Red");

        myCar.startEngine();

    }

}

```

Takeaways / Best practices:

  1. Constructors are used to initialize objects and ensure they are in a valid state upon creation

  2. Use the constructor to set initial values to instance variables or perform necessary setup tasks

  3. Constructors have the same name as the class and can have parameters

  4. If no constructor is explicitly defined, Java provides a default constructor with no parameters.



Topic 9: OOPs


Object Oriented Programming


What is it?


Object-oriented programming (OOP) is a programming paradigm that uses objects - instances of classes - to design and build programs, focusing on the four key principles: encapsulation, inheritance, polymorphism, and abstraction.


Where is it used?


  1. OOP is used in a wide range of applications, from web and desktop applications to games and databases. 

  2. It's a fundamental concept in many popular programming languages like Java, C++, Python, and more.


How is it used?


  1. Define classes: Start by defining classes. A class is a blueprint for creating objects.

  2. Create objects: Create objects from those classes.

  3. Implement encapsulation: Encapsulate the data (variables) and methods inside classes.

  4. Inheritance: Implement inheritance to reuse and extend code.

  5. Polymorphism: Use polymorphism to allow classes to interface with each other.

  6. Abstraction: Use abstract classes and interfaces to handle complexity and expose relevant details.


Takeaways / best practices

  1. Design classes based on real-world objects or concepts, and the relationships and hierarchies between them.

Encapsulation in Java


Encapsulation in Object-Oriented Programming (OOP) is a mechanism that binds together data and the methods that operate on that data, ensuring that the data is accessed and modified only through the defined methods.

  1. Encapsulation is used in OOP to achieve data hiding and abstraction, providing control over data access and modification.

  2. It is used to create classes that encapsulate data and methods into a single unit, known as an object

  3. Encapsulation helps in achieving data security, code maintainability, and reusability.


Here's how encapsulation is typically used in Java:

  1. Declare the class: Define a class and its member variables as private to encapsulate the data

  2. Provide accessor methods: Create public getter and setter methods to provide controlled access to the private member variables

  3. Accessing data: Access the encapsulated data through the getter and setter methods, which validate and control the data access

  4. Modifying data: Modify the encapsulated data using the setter methods, which can perform additional checks or operations before updating the value

  5. Data hiding: By making the member variables private, the internal implementation details are hidden from external access, promoting information hiding and reducing dependency on the implementation

  6. Abstraction: The class interface, consisting of the public methods, defines the abstraction layer through which clients interact with the object. Clients are unaware of the internal implementation.


Code snippet:


```

public class Person {



   /*

   Variables declared private to encapsulate the data

   */
    
private String name;

    private int age;


   /*

   Getter, Setters help us access these private variables

   */
 
   public String getName() {

        return name;

    }

    public void setName(String name) {

        // Additional checks or operations can be performed here

        this.name = name;
    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        // Additional checks or operations can be performed here

        this.age = age;

    }
}

public class Main {

    public static void main(String[] args) {

        Person person = new Person();

        person.setName("John");

        person.setAge(30);

        System.out.println("Name: " + person.getName());

        System.out.println("Age: " + person.getAge());

    }

}

```

Takeaways / Best practices:

  1. Encapsulate the member variables by making them private, and provide public methods for accessing and modifying the data

  2. Use meaningful names for getter and setter methods to convey the purpose of data access or modification.


Inheritance in Java

Inheritance in Java is a mechanism that allows a class to acquire the properties and behaviors (methods and fields) of another class, known as the superclass or parent class.

  1. It is used to create a hierarchical relationship between classes, where subclasses inherit the characteristics of the superclass

  2. Inheritance promotes code reuse and allows for the creation of more specialized classes based on existing ones.


Usage of inheritance:

  1. Create a superclass

    1. Define a class with common properties and behaviors that you want to share with other classes

    2. Use the class keyword followed by the class name to declare the superclass

  2. Create a subclass

    1. Declare a new class using the extends keyword, followed by the name of the superclass

    2. The subclass inherits all the public and protected members of the superclass

  3. Access inherited members

    1. The subclass can access inherited members (methods and fields) directly using dot notation

    2. It can also override inherited methods to provide its own implementation

  4. Add additional functionality

    1. The subclass can define its own unique methods and fields in addition to the inherited ones

    2. It can provide specialized behavior by adding new methods or modifying the behavior of inherited methods.


Code snippet:


```

class Vehicle {
    
protected String brand;

    public void start() {

        System.out.println("Vehicle started.");

    }

}

class Car extends Vehicle {

    private int numOfSeats;

    public void setNumOfSeats(int seats) {

        numOfSeats = seats;

    }

    @Override

    public void start() {

        System.out.println("Car started with " + numOfSeats + " seats.");

    }

}

public class Main {

    public static void main(String[] args) {

        Car myCar = new Car();

        myCar.brand = "Toyota"; // Accessing inherited field

        myCar.setNumOfSeats(4); // Accessing subclass method

        myCar.start(); // Overriding and calling overridden method

    }

}


```


Takeaways / Best practices:

  1. Inheritance is used to create an "is-a" relationship between classes, where a subclass is a specialized version of the superclass

  2. Use inheritance to promote code reuse and to create a logical and hierarchical class structure

  3. Choose appropriate access modifiers (public, protected, private) for the superclass members to control their visibility and access from subclasses

  4. Use the extends keyword to establish the inheritance relationship between classes.

Polymorphism in Java

Polymorphism in Java is the ability of an object to take on different forms and respond differently based on the type of reference used to access it.

  1. It is used when there are classes that are related through inheritance, allowing objects of different classes to be treated as objects of a common superclass

  2. Polymorphism enables flexibility and extensibility in object-oriented programming.


Usage of polymorphism:

  1. Create a superclass

    • Define a class with common properties and behaviors

    • This class will serve as the superclass for multiple subclasses

  2. Create subclasses

    • Declare multiple classes that inherit from the superclass

    • Subclasses can override superclass methods to provide their own implementations

  3. Use superclass reference

    • Declare a reference variable of the superclass type

    • Assign objects of different subclasses to the superclass reference

  4. Invoke methods dynamically

    • Use the superclass reference to invoke methods defined in the superclass

    • The actual method implementation is determined at runtime based on the actual type of the object.


Code snippet:

```

class Shape {
    
public void draw() {

        System.out.println("Drawing a shape");

    }

}

class Circle extends Shape {

    @Override

    public void draw() {

        System.out.println("Drawing a circle");

    }

}

class Rectangle extends Shape {

    @Override

    public void draw() {

        System.out.println("Drawing a rectangle");

    }

}

public class Main {

    public static void main(String[] args) {

        Shape shape1 = new Circle();

        Shape shape2 = new Rectangle();

        shape1.draw(); // Dynamic method dispatch calls Circle's draw() method

        shape2.draw(); // Dynamic method dispatch calls Rectangle's draw() method

    }

}

```

Takeaways / Best practices:

  1. Polymorphism allows you to write more generic and flexible code by treating objects of different classes as objects of a common superclass

  2. Use inheritance to establish an "is-a" relationship between classes and enable polymorphism

  3. Polymorphism is achieved through method overriding, where a subclass provides its own implementation of a method defined in the superclass.


Abstraction in Java

Abstraction in Java is the process of hiding the implementation details and exposing only the essential features of an object or a class.

  1. It is used to create abstract classes and interfaces that define a common behavior without providing implementation details

  2. Abstraction allows for the creation of reusable and modular code.


Usage of abstraction:

  1. Create an abstract class or interface

    • Declare a class as abstract or create an interface to define the common behavior

    • Abstract classes can have both abstract and non-abstract methods

    • Interfaces contain only method signatures without any implementation

  2. Define abstract methods

    • Abstract classes and interfaces can contain abstract methods that have no implementation

    • Abstract methods are declared without a body and must be implemented by the subclasses or classes implementing the interface

  3. Implement or extend

    • Subclasses must extend abstract classes or implement interfaces to provide concrete implementations for the abstract methods

    • Concrete classes implementing an interface must provide definitions for all the methods declared in the interface

  4. Access through abstraction

    • Use abstract classes or interfaces as reference types to create objects

    • The reference type determines the available methods, and the actual object type determines the behavior of those methods.


Code snippet:

```

abstract class Animal {

   //Partial implementation of sound() method in abstract class
 
   public abstract void sound();

}


//Subclasses complete the implementation of sound method using the blueprint 
in Animal class

class Dog extends Animal {
    
@Override

    public void sound() {

        System.out.println("Dog barks");
   
 }

}

class Cat extends Animal {

    @Override

    public void sound() {

        System.out.println("Cat meows");

    }

}

public class Main {

    public static void main(String[] args) {

        Animal dog = new Dog();

        Animal cat = new Cat();

        dog.sound(); // Prints "Dog barks"

        cat.sound(); // Prints "Cat meows"

    }

}

```

Takeaways / Best practices:

  1. Abstraction allows you to create a hierarchy of classes or interfaces that define common behavior while hiding implementation details

  2. Use abstract classes when you want to provide a partial implementation and allow subclasses to complete the implementation

  3. Use interfaces when you want to define a contract for a group of classes to implement.



Topic 10: Integer Class in Java


The Integer class in Java is a wrapper class that allows you to use and manipulate integer values as objects. It provides methods to perform various operations on integers and convert them to different data types.

The Integer class is used in the following scenarios:

  1. When you need to treat an integer as an object, such as when working with collections or generics that require object types

  2. When you need to perform operations like parsing, converting, or formatting integers.


Here's how the Integer class is typically used in Java:

  1. Declare an Integer object by specifying the class name followed by the variable name

  2. Assign a value to the Integer object using either a constructor or the valueOf() method


Code snippet:

```

Integer num1 = new Integer(10); // Creating an Integer object using a constructor

Integer num2 = Integer.valueOf("20"); // Creating an Integer object using valueOf()


```


Takeaways / Best practices:

  1. The Integer class provides a way to work with integer values as objects

  2. Use the Integer class when you need to treat integers as objects or when working with collections or generics.

Topic 11: Java System & Libraries


Packages and Imports


What is it?


In Java, a package is a namespace for organizing classes and interfaces in a logical manner, while an import statement is used to bring in code from different packages into the current file for use.


Where is it used?


Packages and imports are used throughout Java programming to manage and organize large codebases and to reuse code across multiple files or applications.


How is it used?


  1. Create a package: Packages are defined at the top of a Java file with the package keyword followed by a unique package name: package com.mycompany.myapp;

  2. Add classes to a package: Any classes or interfaces defined in the file are part of the package.

  3. Import a package: Use the import keyword at the top of a Java file to bring in a class or an entire package: import java.util.ArrayList; or import java.util.*;

  4. Use imported classes: After importing, you can use the classes and interfaces in your code.


Code Snippet:


MyClass.java

```

package com.mycompany.myapp;



public class MyClass {

    public void printMessage() {

        System.out.println("Hello from MyClass!");

    }

}

```



Test.java

```

import com.mycompany.myapp.MyClass;



public class Test {

    public static void main(String[] args) {

        MyClass myClass = new MyClass();

        myClass.printMessage(); // prints: Hello from MyClass!

    }

}

```


Takeaways / best practices


  1. Use packages to avoid naming conflicts and to write better maintainable code.

  2. Use meaningful package names in lower case. Typically companies use their reversed Internet domain name to begin their package names—for example, com.example.mypackage for a package named "mypackage" created by a programmer at "example.com".

The Math Library

The Math library in Java provides a set of predefined mathematical functions and constants for performing common mathematical operations.

The Math library is used in various scenarios where mathematical calculations are required, such as scientific calculations, numerical analysis, geometry, and more.

Here's how the Math library is typically used in Java:

  1. Import the Math class in your Java program using the import statement: import java.lang.Math

  2. Access the mathematical functions and constants provided by the Math class using the dot notation, for example, Math.sqrt() for calculating the square root

  3. Use the various methods available in the Math class to perform mathematical operations, such as trigonometric functions (sin(), cos(), tan()), logarithmic functions (log(), log10()), exponential functions (exp(), pow()), rounding functions (round(), ceil(), floor()), and more.


Code snippet:

```

import java.lang.Math;

public class MathExample {
  
  public static void main(String[] args) {

        // Calculate the square root of a number

        double squareRoot = Math.sqrt(25);

        System.out.println("Square root of 25: " + squareRoot);

        // Calculate the sine of an angle

        double sineValue = Math.sin(Math.toRadians(30));

        System.out.println("Sine of 30 degrees: " + sineValue);

        // Round a number to the nearest integer

        int roundedValue = Math.round(3.7f);

        System.out.println("Rounded value: " + roundedValue);

    }

}


```


Takeaways / Best practices:

  1. Import the Math class to use the functions and constants provided by the library

  2. Ensure that the required arguments for the methods are correctly provided

  3. Be aware of the data types used in calculations to ensure accurate results.


JVM-JDK-JRE

JVM (Java Virtual Machine), JDK (Java Development Kit), and JRE (Java Runtime Environment) are essential components of the Java platform that enable the execution and development of Java applications.

Here's a breakdown of each component:

  1. JVM (Java Virtual Machine

    • JVM is an abstract machine that provides an execution environment for Java applications

    • It interprets and executes Java bytecode, which is generated by the Java compiler from Java source code

    • JVM is responsible for various tasks such as memory management, garbage collection, and platform independence

    • It acts as a bridge between the Java application and the underlying hardware or operating system

  2. JDK (Java Development Kit

    • JDK is a software development kit that includes tools and libraries necessary for developing Java applications

    • It consists of the Java compiler, which translates Java source code into bytecode, and other development tools like debugger, profiler, and documentation generator

    • JDK also includes a set of class libraries, known as the Java API (Application Programming Interface), that provides pre-written code for common functionalities

  3. JRE (Java Runtime Environment

    • JRE is a subset of the JDK and is required to run Java applications

    • It includes the JVM and a set of class libraries that are necessary for executing Java programs

    • JRE does not include the development tools present in the JDK

    • End-users who only need to run Java applications on their systems typically install the JRE.


Usage of JVM, JDK, and JRE:

  1. JVM is used to execute Java bytecode and run Java applications on various platforms, including desktops, servers, and mobile devices

  2. JDK is used by developers to write, compile, and debug Java code. It provides the necessary tools and libraries for Java application development

  3. JRE is used by end-users to run Java applications without the need for development tools.


Takeaways / Best practices:

  1. Install the appropriate JDK version based on your development needs

  2. Set up the environment variables (e.g., PATH variable) to point to the JDK and JRE installations

  3. Use the JDK to compile your Java source code into bytecode using the javac command

  4. Run Java applications using the JRE by executing the bytecode with the java command

  5. Ensure that the JVM version matches the required Java version for your application.


All the Best and Happy Learning!


Was this article helpful?

That’s Great!

Thank you for your feedback

Sorry! We couldn't be helpful

Thank you for your feedback

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article