CodingBison

Introduction

Term: JVM
Description: Java virtual machine, which is available in all the platforms that supports Java, converts the byte code into something that the platform understands. Thus, when we develop an application in Java, we don't have to worry about the platform on which it would be run, as JVM would automatically take care of the platform dependencies.

Term: Java keywords
Description: A "keyword" is something that cannot be the name of a variable/class/method etc. "class" is a keyword, this means you cannot have a variable/method with the name "class". There are quite a few key words defined in Java. class, int, for, while etc are few examples of keywords.

Class and Object

Term: Object
Description: Java objects are based on Java classes. You might say that a class is a blueprint of an object. So, what is an object? Well, an object is an instance of a class. An object stores the states (specific details) of the properties defined in the class.
Example: Here a "person" class is defined with 2 properties "name and ID". An object when instantiated and used, stores the specific properties. for example, "personName = James, personId = 32456", "personName = Wilson, personId = 32457" etc. We can instantiate as many objects as we want.
 class person {
   String  personName;
   double  personId:
 }
Term: Access Specifiers
Description: In order to restrict the scope of the elements, Java provides three types of access specifiers. public, private, protected ( All of these are Java Keywords). There is an other access specifier called as "Default access specifier". This specifier gets applied when none of the above 3 are specified.

Keyword: class
Description: A Java class is a collection of variables (called Properties) and functions (called methods). Properties store the data that is of interest to the class and methods define the function/logic that handles the data. Thus, with a class, you get the complete package;
Example: Here a "person" class is defined with 2 properties, "name and ID".
 class person {
   String  personName;
   double  personId:
   void setPersonName(String name) {
   }
   // Few other methods
 }

Data Types

Term: Primitive Data Types
Description: Like most of the programming language, Java allows us to store data of different types. Java supports a wide range of variable types.
Here is the list of the primitive data types supported by Java. Java Integers type includes int, short, byte, long and they store whole numbers, like 3,234,567. Java Floating type includes float, double and they store decimal numbers like 34.5, 56.7 etc. Java character type include char and it stores characters, symbols. 'c', 'g', '#' etc. Java boolean type is bool, and it stores just 2 values, TRUE or FALSE.

Term: Variable Scope
Description: Java allows us (Unlike, C Programming language which requires all the variables to be declared at the start of the function) to declare a variable as and when you need it. This brings in the concept "Scope of the variable". In general, a variable is visible to only certain block of a program. A variable declared at the start of the function is visible through out that function, but not to other functions. The visibility of a variable can be termed as the "scope" of the variable.
Example: As show in the below code snippet, a variable can be declared any where in the function. For example, variable "z" is declared at the end of the function and variable x is defined inside an if block, whose scope is limited only to that block.

 void function () { 
     int y;
     if (condition) {  // Scope of this blocks starts here. 
                       // What ever defined in this block is visible only to this block.
         int x = 10;  // x is declared inside this "if block".
         y = x;
     } // Scope of the block ends here.
     int z = 5;  // This statement throws an error, because x is not visible to this block of the code.
 }
Term: Type Casting
Description: We can copy a variable of type t1 to a variable of type t2, if t1 and t2 are of same type and t1 and t2 are compatible. However if t2 is larger than t1 and we try to copy, then the compiler may not be happy with that, for such cases you would need to use casting before the copying.
Example: Like shown in the above code snippet, typecasting can be done when the variables are of different types. Sometimes, implicit typecasting and some other times, typecasting needs to be done explicitly.

 int y = 20;
 long x = y; // x and y are of different types and hence typecasting is done here.
 	     // Since int and long are compatible, internal typecasting is performed by the compiler itself.
 long x;
 x = (long) y; // Though typecasting is not required, explicit typecasting "can" be done.
 int x = 20;
 byte y;
 y = x;  // This throws an error, compiler cannot do the implicit conversion because byte and int are not compatible. 
 y = (byte)x; // This requires an explicit conversion.
Term: Variable Operators
Description: Besides simple operators to do addition and multiplication, Java provides additional arithmetic operators as well: subtraction using "-", division using "/", modulo using "%" etc. We should note that the modulo operator has an important constraint: both of the variables should be integral (integer, short, char) and not float or double.
Java also provides a set of operators that operate the value of a variable. For example, if we were to increase the value of "var1" by 10, we could do "var1 = var1 + 10" or more crisply, "var1 += 10". Likewise, if we were to multiply the value of "var1" by 10, we could do "var1 = var1 * 10" or "var1 *= 10". Same rule applies to several other operators like subtraction "-"), division ("/"), modulo ("%"), bit-shifts ("<<" or ">>"), logical and ("&"), logical or ("|"), etc.
Another set of handy operators are the unary operators: "++" and "--", these operators increment and decrement an integer variable by 1 respectively. Thus, "var1 = var1 + 1" is same as "var1++". Likewise, "var1 = var1 -1" is same as "var1--".
However, we should note that the above unary operations can be applied either before or after a variable and accordingly, it can have different meanings. For example, "var1++" means that we use the variable first and then increment it, where as, "++var1" means we increment the variable first and then use it. Thus, "var2 = ++var1" and "var2 = var1++" mean different assignments to var2. It is a bad idea to have complicated expressions involving these operators; overzealous usage of these operators can create confusing statements that will reduce code-readability!

Term: Arrays
Description: Imagine if you want to declare a large number of variables of the same type ( Let us say N ), it is tedious to declare variables like var1, var2, var3 ......varN. Arrays will help you in avoiding the tedious effort of declaring N variables.
Array is a collection of similar variables. Size of the array can be defined, declaring an array of size N is equal to declaring N variables. Each array element is identified using an index. For an array with N values, the first element has an index of 0, the second element has the next index value of 1, and in the end, the last element has an index of (N-1). We can easily navigate, and update the integer values stored in this array.
Example: The following code has an example usage/syntax of an array in Java.


 Syntax for declaring an array .
 <array_type>  <array_variable_name>[] = new (special operator) <
 int arrayVar[];    // Declaring an array.
 arrayVar = new int[5]; // Allocating memory for (5 entries) an Array.
 /* The below statement can replace the above 2 statements */
 /* Single statement can be used to declare and allocate the space for an array*/
 int arrayVar[] = new int[5]; // This is how you declare and allocate space for an array.
 arrayVar[0] = 237;
 arrayVar[2] = 101;
Term: MultiDimensional-Arrays
Description: The arrays we have seen so far are single dimensional arrays. An array can also be a multi dimensional array. A multidimensional array is simply an array of arrays. Let us see how a multi dimensional array looks like.
Example: The following code has an example usage/syntax of a Multidimensional array in Java.


 Declaring an array .
 <array_type>  <array_variable_name>[][] = new (special operator) <
 Notice, mentioning the size of 2nd dimension is optional.
 Array type could be any basic data type, example int, double, float etc.
 int arrayVar[][] = new int[5][];
 double arrayVar[][] = new double[3][];
 This how a variable 2 dimensional array (like shown in the above figure) is declared.
 arrayVar[0] = new int[10] // Size of the 2nd dimension declared here is 10.
 arrayVar[1] = new int[4]  // Size of the 2nd dimension declared here is 4.
 arrayVar[2] = new int[6]
Term: Variable MultiDimensional-Arrays
Description: A multi dimensional array need not be as show in the below figure, we may want to have more flexibility with a multi dimensional array. Java's flexibility happily meets our demand, we can also have a multi-dimensional array, where each array is of different depth. Let us see another 2-dimensional array but this time with variable length.
Example: The following code has an example usage/syntax of a Variable-Multidimensional array in Java.


 Declaring an array .
 <array_type>  <array_variable_name>[][] = new (special operator) <
 Notice, mentioning the size of 2nd dimension is optional.
 Array type could be any basic data type, example int, double, float etc.
 int arrayVar[][] = new int[5][];
 double arrayVar[][] = new double[3][];
 This how a variable 2 dimensional array (like shown in the above figure) is declared.
 arrayVar[0] = new int[10] // Size of the 2nd dimension declared here is 10.
 arrayVar[1] = new int[4]  // Size of the 2nd dimension declared here is 4.
 arrayVar[2] = new int[6]
Term: Strings
Description: String is one of the widely used data types in any programming language. A string is basically a collection of characters. If you are familiar with "C" programming language, you would know how difficult it is manage string in C. In fact C programming language does not support string data type, a string in C is nothing but a character array. By comparison hand Java provides a much better support for Strings.
String is not a primitive data type in Java; it is actually a Class. When ever a string variable is created using "String <string-name>" we are actually creating an object of the class "String". String class in Java provides wide range of constructors and methods that can be used to manipulate the strings. Let us look at a sample program that helps in understanding the concept of String.

Example: The following example program demonstrates the usage of some of the utility methods provided by Java's String class that helps in manipulating the strings.

 public class StringExample {
     public static void main(String[] args) {
         String stringVar;
         stringVar =  "This is a String";
         String stringVar2 = " variable";
         // Declaration and assignment in the same line.
         // String string_var = "This is a String variable";
         System.out.println("String: " + stringVar + ", Length: " + stringVar.length());
         System.out.println("String: " + stringVar + ", Concatenated String: " + stringVar.concat(stringVar2));
         // Returns -ve number if the stringVar2 is lesser than stringVar, else  return +ve number.
         System.out.println("String: " + stringVar + ", Compare Strings: " + stringVar.compareTo(stringVar2));
         // Return the index of first occurrence of the character.
         System.out.println("String: " + stringVar + ", index of " + stringVar.indexOf('s'));
         System.out.println("String: " + stringVar + ", index of " + stringVar.lastIndexOf('s'));
     }
 }

Conditionals

Term: Conditional Operator
Description: conditional operator is an alternate way for "if-else" clause: "if (condition) ? do_this_1 : do_this2". If the "condition" is True, then Java runs "do_this_1", else, it runs "do_this_2".
Example: The below code snippet shows the syntax/usage of conditional operator.
 if (condition) ? do_this_1 : do_this2;
Keyword: if and if-else
Description: If the condition evaluates to True, then the program executes task pertaining to that condition otherwise it executes other task. NOTE: There could be an if condition alone with out an else part. "if and else" are 2 different keywords.
Example: The below code snippet shows the syntax/usage of if, if-else condition.
 // Usage of "if" condition.
 if (condVar > 5) {
    printf(" condVar is greater than 5");
 }
 // Usage if if-else condition.
 if (condVar > 5) {
   printf(" condVar is greater than 5");
 } else {
   printf(" condVar is lesser than or equal to 5");
 }
Keyword: if-elseif-else
Description: If the condition evaluates to True, then the program executes task pertaining to that condition otherwise it checks for the condition in the next if condition and it goes on until the condition is true. NOTE: If none of the conditions are true, the final else part is executed. If final else part is not available, then the control just goes out of the "if conditions" with out executing any statement. "if and else" are the 2 different keywords (They are the only 2 keywords), there is no such key word called "elseif". Please take a look at the below example.
Example: The below code snippet shows the syntax/usage of if-elseif-else condition.
 // Usage if if-elseif-else condition.
 if (condVar > 0 && condVar < 10) {
   printf(" condVar is between 0 and 10");
 } else if (condVar >=10 && condVar < 100) {
   printf(" condVar is between 10 and 100");
 } else if (condVar >= 100 && condVar < 200) {
   printf(" condVar is between 100 and 200");
 } else { 
   printf(" condVar is not in the range 0 to 200");
 }
Keyword: Switch Case
Description: Switch-case is an alternate way of using if-else-if. Switch statement is faster than if-else-if, as the control directly jumps to the appropriate "case" statement. Every "case" block should end with a "break" statement. "Default" is a catch all condition, if condVar does not match any of the case blocks; default block gets executed.
NOTE: switch, case, break, default are all keywords. condVar should be either an integer value or a character.
Example: The below code snippet shows the syntax/usage of switch-case.
 switch (condVar) {
 case 10:
   printf(" condVar value 10");
   break;
 case 20:
   printf(" condVar value 20");
   break;
 default:
   printf(" Default condition hit ");
 }

Loops

Keyword: while
Description: The looping happens as long as the specified condition is true and we quit the loop when the condition becomes false. Naturally, after every round, we need to update the loop state (or the condition variable) so that we can re-check if the condition has become true; In the below example,
Example: The while loop in the below example loops 5 times. Note - "while" is a keyword.
 condVar = 0;  // While loop condition - Initialization
 while ( condVar < 5 ) { // While loop condition - Check
     // Do something
     condVar++;  // While loop condition - Update.
 }
Keyword: for
Description: For loop has all the 3 phases of looping in one expression: initialization, conditional-check, and update conditional variable The first part of the for loop is the initialization (e.g., "counter=0"), the second part is the loop-termination (e.g., "counter < 3"), and the last part is updating the conditional variable (e.g., "counter++"). Note that both initialization and updating the loop state is done automatically by the for-loop. We just need to specify it in the for-expression.
Example: The for loop in the below example loops 5 times. Note - "for" is a keyword.
 for ( condVar = 0; condVar < 5; condVar++ ) {
     // Do something
 }
Keyword: do-while
Description: The do-while loop has a similar format to that of a "while" loop, except that the while clause sits at the very end of the loop block. The distinctive feature of this variant is that the looping block would get executed at least once. This happens because even if the condition is false, the program must run starting from "do" till the point where it reaches the "while" condition. For cases, where we need to run the loop for the first round, whether condition is met or not, we should consider deploying "do-while" method
Example: The for loop in the below example loops 5 times. Note - "do", "while" are keywords.
 condVar = 0;  // While loop condition - Initialization
 do {
     // Do something
     condVar++;  // While loop condition - Update.
 } while ( condVar < 5 ); // Do-While loop condition - Check
Keyword: continue
Description: Java provides methods for an application to be more selective when running inside a loop. There are two specific tasks that an application might wish to do when present in a loop: skip some of the records and break out of the loop. Java provides a keyword, "continue" that allows a program to skip a record.
NOTE: This keyword could be used in any of the loops (for, while, do-while).
Example: The below example illustrate the usage of the keyword "continue" with a for loop. The keyword "continue", does not impact the number of times the loop is executed, loop would still complete the full execution. In the below example, the statement above "continue" statement is executed all the time, and the statement below "continue" is executed only when the "condVar is an odd number". Thus, continue allows a program to skip a record/records.
 for ( condVar = 0; condVar < 5; condVar++ ) {
     System.out.println(" All numbers : " + condVar);
     // Skip all the even numbers.
     if (conVar%2 == 0)
 	continue;
     System.out.println(" Odd Numbers only : " + condVar);
 }
Keyword: break
Description: Java provides methods for an application to be more selective when running inside a loop. There are two specific tasks that an application might wish to do when present in a loop: skip some of the records and break out of the loop. Java provides a keyword, "break" that allows you to break out of the loop.
NOTE: This keyword could be used in any of the loops (for, while, do-while).
Example: The below example illustrate the usage of the keyword "break" with a for loop. The keyword "break", impacts the number of times the loop is executed, loop execution would end the moment a break statement is encountered. In the below example, the loop ends (control breaks out of the loop) as soon as the condition (condVar == 3) is hit.
 for ( condVar = 0; condVar < 5; condVar++ ) {
     System.out.println(" Only till 3 is executed : " + condVar);
     if (conVar == 3) {
 	System.out.println (" Break the loop when condVar is 3 ");
 	break;
     }
     System.out.println(" Nothing after 2 is printed : " + condVar);
 }

OOP Concepts

Term: Encapsulation
Description: Encapsulation is a process of binding data and the code that acts on the data. Class and object forms the core of the concept "Encapsulation". All the variables (Data) defined in the class can only be accessed by using the methods (Methods has the code/logic that acts on the data) defined in that class. So, a class binds data and the methods together which is precisely Encapsulation. "Object" which is an instance of a class helps in accessing the data using the methods defined in that class.

Term: Inheritance
Description: Inheritance is one of the core concepts of object oriented programming. Inheritance, as the name says, means inheriting some of the properties from parents or grand parents. Java has the concept of sub-class and super-class, sub-class can inherit some of the properties (not all properties) of its super-class. A sub-class can also define its own specific properties, thus a sub-class has the inherited properties plus its own sub-class properties. If we were to compare inheritance with a real life example, a child inherits some of the features from his/her parents at the same time has some features specific to him.

Term: Polymorphism
Description: The literal form of polymorphism is "Many forms". Java supports the concept of "Overloading", which lets us define one or more methods with the same name provided their signature is different. Overriding is another form of polymorphism where a super-class and sub-class can define the exact same method (including the signature).
Java also supports another behavior called run-time polymorphism, which means decision on which action to choose is taken at the run time.

Term: Abstraction
Description: Abstraction is a process of exposing only the required/essential features and hiding the internal implementation details. The term abstraction is very loosely defined and the boundaries are not as clear. The concept of abstraction is used in most of the OOP concepts, for instance when we define a class, it hides a lot of details and only expose few methods/properties. Java supports features like "interface and abstract class", where the concept of abstraction is more clearly visible.

Term: Constructor
Description: A constructor in Java has the same name as that of a class; notice the name "Movie" in the below example. The main purpose of a constructor is to initialize the objects, an object initialization is done as soon as they are created.
Example: In the below example, notice the name of the "constructor" same as that of class.
 class Movie {
      String name;
      int yearOfRelease;
      // Constructor
      Movie() {
          System.out.println(" Inside the constructor ");
          name = "Jame Bond Movie";
          yearOfRelease = 0000;
      }
      /*
       * There will be other things in the class.
       */
 }
Term: Default Constructor
Description: A constructor in Java has the same name as that of a class; notice the name "Movie" in the below example. The main purpose of a constructor is to initialize the objects, an object initialization is done as soon as they are created. A default constructor is one that takes no arguments, it initializes all the objects with the same default values.
Example: In the below example, notice the name of the "constructor" same as that of class.
 class Movie {
      String name;
      int yearOfRelease;
      // Default Constructor, initializes the object with default values.
      Movie() {
          System.out.println(" Inside the default constructor ");
          name = "Jame Bond Movie";
          yearOfRelease = 0000;
      }
      /*
       * There will be other things in the class.
       */
 }
Term: Parameterized Constructor
Description: A constructor in Java has the same name as that of a class; notice the name "Movie" in the below example. The main purpose of a constructor is to initialize the objects, an object initialization is done as soon as they are created. A parameterized constructor takes the arguments and initializes the object with the values passed (at the time of object creation) as arguments to the constructor.
Example: In the below example, notice the name of the "constructor" same as that of class.
 class Movie {
     String name;
     int yearOfRelease;
     // Parameterized constructor, initializes the objects with the parameters passed to it. 
     Movie(String name, int yearOfRelease) {
          System.out.println(" Inside the parameterized constructor,"
                          + " initializing the object, Movie Name: " + name);
          this.name = name;
          this.yearOfRelease = yearOfRelease;
      }
      /*
       * There will be other things in the class.
       */
 }
Keyword: this
Description: The main purpose of "this" key word is to reference the current object. When the names of the parameters passed to the constructor and the local variables used inside are same, the local variables corresponds to the "current" object, "this" key word references the current object and thus helps in differentiating the variable that has the same name.
Example:
 Class movie {
   String name;
   int yearOfRelease;
   movie(String name, int yearOfRelease) {
        System.out.println(" Inside the parameterized constructor,"
                            + " initializing the object, Movie Name: " + name);
        this.name = name;
        this.yearOfRelease = yearOfRelease;
   }
 }

Polymorphism

Term: Overloading (Method Overloading)
Description: This concept of having the same name for more than one method is called "overloading". If you are coming from "C programming" back ground, this sounds little crazy. But, yes Java supports "overloading" Thus, with overloading, 2 methods in Java can have the same name but their "signatures" (Signature is nothing but, methods return type, argument list, argument type) are different. One of the ways of achieving Polymorphism (which means "many forms") in Java, is through overloading.
NOTE:We could overload a method as many times as we want, method with 1 argument, method with 2 args and so on.
Example: In the below example, the method "add" has been overloaded.
 class overloading {
     void add (int x, int y, int z) {
       int sum = x + y + z;
       System.out.println (" Integer Sum : " + sum);
     }
     double add (double x, double y) {
        return x + y;
     }
 }
Term: Constructor Overloading
Description: Constructors follow the same semantics of a method, 2 or more methods can have the same name provided their signature changes. In the below example, we have overloaded the constructor, default constructor has zero arguments while the parameterized constructor has 2 arguments. This concept of having the same name for the constructors is called "Constructor overloading". We could overload constructor as many times as we want, constructor with 1 argument, constructor with 2 args and so on.
Example: In the below example, notice the name of the "constructor" same as that of class.
 class Movie {
     String name;
     int yearOfRelease;
     // Default Constructor, initializes the object with default values.
      Movie() {
          System.out.println(" Inside the default constructor ");
          name = "Jame Bond Movie";
          yearOfRelease = 0000;
      }
     // Parameterized constructor, initializes the objects with the parameters passed to it. 
     Movie(String name, int yearOfRelease) {
          System.out.println(" Inside the parameterized constructor,"
                          + " initializing the object, Movie Name: " + name);
          this.name = name;
          this.yearOfRelease = yearOfRelease;
      }
      /*
       * There will be other things in the class.
       */
 }

Inheritance

Term: Java Inheritance
Description: Inheritance is one of the key concepts of object oriented programming. Inheritance defines the hierarchical relationships between various classes. With inheritance, a generic class (aka super-class) can be defined with a set of generic properties. This generic class can then be inherited by any other class (sub-class). Sub-class can define its own specific properties, along with the ones that are inherited from its super-class. Thus a sub-class can pick and choose from its parent (or ancestor) class and also define its own.
NOTE: Inheritance in Java is achieved using the keyword "extends".

Term: Multilevel-Inheritance
Description: If needed, a sub-class can become a parent itself. This is called multilevel inheritance. Java allows inheritance at multiple levels. For example, we can have a sub- class sb3 inherit the properties of sb2, which in turn inherit the properties of sb1 and su1.
su1 -- sb1 -- sb2 -- sb3.
NOTE: Inheritance in Java is achieved using the keyword "extends".

Term: Multiple-Inheritance
Description: There is also yet another concept called multiple inheritance. In this method, a sub-class inherits properties from more than one super-classes. While multiple inheritance can be useful in some cases, Java "does not" support it because of the complexity it brings in. In order to gain the advantages of multiple inheritance, Java supports a concept called "Interface".
NOTE: Inheritance in Java is achieved using the keyword "extends".

Term: Overriding
Description: Overriding refers to a concept where, a method in the sub-class/sub-classes has the same name and same signature, as that of a method in its super class. Overriding unlike overloading allows us to have 2 or more methods with the same name and also the signature.
NOTE: Super keyword is used to access the super classes methods.
Example: In the below example, the method "method1" has been overridden.
 class movie {
    int method1(int var) {
    }
 }
 class jamesBondMovies extends movie {
    int method1(int var) {
    }
 }
Term: Runtime Polymorphism
Description: Run time polymorphism is a concept where, the decision to call the correct version (When the methods are overridden), of methods is determined at the run time based on the object type.
Example: Please take a look at Method overriding section on codingbison.com/java for an example.
 class movie {
    int method1(int var) {
    }
 }
 class jamesBondMovies extends movie {
    int method1(int var) {
    }
 }
Term: Abstract Class
Description: An abstract class, as the name says it is just declaration and, it does not have a concrete implementation. There would be many scenarios where a super-class is not aware of the content that goes into the methods, and only the sub-class that inherits it, would have that info. Accordingly, we can use the abstract class to mandate that every sub-class must define their own implementation of the abstract class.
NOTE: "abstract" is a keyword
Example: Notice the keyword "abstract" in-front of class name and also in-front of the abstract method.
 abstract class movie {
     String name;
     int    length;
     String director;
      /*
       * There will be other things in the class.
       */
      /* This is an abstract method, and the sub-classes will
       * have to implement it.
       */
      abstract void fillThePlotSummary(String summary);
 }
Keyword: extends
Description: The keyword "Extends" is used by a sub-class to inherit the properties from a super-class.
Example: In the below example, "movie" is a super class and "jamesBondMovies" is a sub-class. sub-classes will inherit the common properties from its super-class and also have their own set of specialized properties.
 class movie {
     String name;
     int    length;
     /*
      * There will be other things in the class.
      */
 }
 class jamesBondMovies extends movie {
    /* jamesBondMovies class inherits the properties
     * from its super class.
     */
 }
Keyword: super
Description: The keyword "super" has two use-cases. First, in the case of inheritance "super" keyword is used to call the super-class's constructor and second, it is used to access super-class's members.
Example: Please take a look at Inheritance section on codingbison.com/java for an example.

Keyword: final
Description: The keyword "final" has 3 use-cases. First, a class that has a "final" keyword in front of it cannot be extended, in other words final stops inheritance of a class. Second, The other power full concept of object oriented programming "overriding", can also be stopped by using the keyword "final". A method cannot be overridden if it has the keyword "final" in-front of it. Third, "final" keyword is used to "declare constant values". Thus a variable with the "final" keyword in-front of it cannot be assigned any other values. So, a final variable will have to be initialized.
Example: The below example declares a constant using the keyword "final".
 public class finalExample {
     public static void main(String[] args) {
         final int finalVar = 100;
         System.out.println(" Final variable value " + finalVar);
         // This is not allowed, this throws a compilation error.
         //finalVar = 200;
     }
 }
Keyword: static
Description: A variable declared static is instantiated only once and hence it is shared across all the object. A method that declared static has few restrictions, first, they can only call static variables inside its body. Second, they can only call other static methods and third, they cannot use the keywords "super" or "this".
NOTE: We don't need an object to invoke the static members of a class. All the static members can be directly invoked with the help of its class name, eg..staticClass.method1();.

Exception Handling

Term: Exception Handling
Description: An exception is an error condition that occurs at the run time. The reason for the runtime error/Exception could be many, like code error, system resources, invalid input etc. Some of the programming languages like C do not provide support for exception handling mechanisms, but Java has an effective way of handling exceptions.
A program with exception handling mechanism, will allow the program to continue execution even after an error in the program. With exception handling, the program is not terminated abruptly and it also give a better control on the program flow. Another advantage of exception handling is that, it gives the program a chance to rectify itself.
Java provides 2 keywords "try" and "catch" to deal with the exceptions in the code.

Term: Checked Exceptions
Description: The Exception class in Java, itself has 2 types (Runtime exceptions and IO exceptions) of subclasses under it. All the IO exceptions are called checked exceptions because compile throws an error if there are not handled. It is must that a program handles IO exceptions aka checked exceptions (Compiler checks if they are handled or not).
"File Not Found" exception is an example of checked exceptions.

Term: Unchecked Exceptions
Description: The Exception class in Java, itself has 2 types (Runtime exceptions and IO exceptions) of subclasses under it. Runtime exception also called unchecked exceptions are handled by the compiler during the runtime. Compiler does not catch these hence does not throw any compile time errors.
"Arithmetic exception" is an example of Un-checked exceptions.

Keyword: try/catch
Description: Java provides 2 keywords "try" and "catch" to deal with the exceptions in the code. Try/Catch block, all the code that needs to be protected from exceptions would be in the "try block" and the exceptions in the try block are caught in the "catch block".
NOTE: A try block can have multiple catch blocks, which indicates multiple types of exceptions could arise from the try block. It is also possible to have nested try/catch blocks.
Example:
 try {
    //Code that may cause an exception.
    } catch (Exception e1) {
       // Exceptions are caught in the catch block.
       System.out.println(" Catch Block, Generic Exception");
    }
 }
Keyword: throw
Description: Java run-time system handles all the standard exceptions. However, there would be some scenarios, where the statements are perfectly valid from Java run-time systems perspective, but the application would sill want to handle those scenarios as "exceptions". Thus, an application can trigger a new exception using the keyword "throw". This exception is treated just like any other runtime exceptions.
Example:
 try {
    //Code that may cause an exception.
    if (exception_condition) {
        throw new ArithmeticException(" Application's exception ");
    } catch(ArithmeticException e1)  {
        System.out.println(" Try Block-1:Catch Block, Arithmetic Exception " + e1);
    } catch (Exception e2) {
       // Exceptions are caught in the catch block.
       System.out.println(" Catch Block, Generic Exception");
    }
 }
Keyword: throws
Description: Unchecked exceptions are handled in 2 ways. First, using a try catch block. Second, using the keyword "Throws". Let us say, we do not want to handle the unchecked exception using the try/catch block and wanted others ( the caller of the method/code block where the exception is) to handle it, the keyword throws is used. The keyword "throws" indicates the callers/calling method to expect an exception and handle it.
Example:

Keyword: finally
Description: All the statements inside the finally block will be executed at the end of a try/catch block. Also, the statements inside finally block will be always executed (either way exception is hit or not). The "finally" code is used when an application want to close some sockets, file descriptor(fd), free some memory etc. A "finally" is optional, a catch block could be replaced by a finally block; try/finally or try/catch or try/catch/finally.

Packages

Term: No Access Specifier
Description: A class can have either "public or no access specifier". Variables, constructors, methods are allowed to have any access specifiers. The scope of the member/elements that does not have any specifiers is same as that of "protected".

Keyword: package
Description: When a Java application grows big, it would be difficult to maintain all the class/Java files that are present in the project. Accordingly, it would be nice to have a logical separation of classes depending on the module. This logical separation of name space is called a package. A package in Java is created with help of a keyword "package".
NOTE: "package" is a keyword.

Keyword: public
Description: A class can have either "public or no access specifier". Variables, constructors, methods are allowed to have any access specifiers. A member/element declared public is visible through out the application and this is the highest level of visibility that any Java element could get.
NOTE: "public" is a keyword.

Keyword: private
Description: Access specifier "private" is not allowed in-front of the key word "class". Variables, constructors, methods are allowed to have any access specifiers. A member/element declared private is not visible to anyone outside the class in which it is defined.
NOTE: "private" is a keyword.

Keyword: protected
Description: Access specifier "protected" is not allowed in-front of the key word "class". Variables, constructors, methods are allowed to have any access specifiers. A member/element declared protected is not visible to anyone outside the package in which it is defined.
NOTE: "protected" is a keyword.

Interface

Keyword: interface (Specifying Methods)
Description: The concept of "interface" is similar to that of an abstract class. The main difference between an interface and an abstract class is that, an abstract class will have 1 or 2 methods (not all methods in a class) that are defined as "abstract". Where as, with interface, we can achieve complete abstraction of a class. Interface will have all the methods declared, there would be no method definitions (Method body/logic). Its up to a class that "implements" an interface to implement all the methods present in the interface.
NOTE: interface, implements are keywords. Also, note that "interface" can be extended and all the concepts of inheritance that applicable to a class are also applicable to an interface.
Example:
 interface movieInterface {
     void fillThePlotSummary(String summary);
     // This interface could have many more methods.
 }
 // The class that implements the interface will have to implement the methods
 // defined in interface. In this example the method "fillThePlotSummary".
 class casinoRoyal implements movieInterface {
     String plotSummary;
     public void fillThePlotSummary(String summary) {
         this.plotSummary = summary;
     }
 }
Keyword: interface (Defining constants)
Description: An interface can also be used to define constants, variables etc. If you are familiar with "C" programming, this is similar to the way "#define" or constant are used. Example usage of interface for defining constants.
NOTE: interface, implements are keywords.
Example:
 File Name: sharedConstants.java
 -------------------------------
 public interface sharedConstants {
     String FIRST_PLACE = "Gold";
     String SECOND_PLACE = "Silver";
     String THIRD_PLACE = "Bronze";
 }

Garbage Collection

Term: Garbage Collection
Description: It is the responsibility of the application to release the memory (Dynamically allocated memory) back to the system at the end of its execution. If the memory used up by the application is not released, it leads to memory leaks and eventually the application will run out of memory. This concept of releasing/deallocating the memory back to the system is called Garbage collection. Java application does not have to worry about "freeing the memory/memory leaks" as Java runtime systems takes care of garbage collection internally.

Term: finalize method
Description: Java runtime system will not be able to free a non-java resource, as a part of garbage collection concept. File descriptors, sockets etc are some of the examples of non-java resources. Application will have to take up that responsibility with the help "finalize" method. Application has to define a method "protected void finalize()" and the logic to free up the non-java resources will be in this method. Java run time system invokes this method just before the garbage collector kicks in to free up the memory.





comments powered by Disqus