Abstract class has been discussed already in Unit-3 (Abstraction).

The keyword final has three uses. First, it can be used to create the equivalent of a named constant. The other two uses of final apply to inheritance. 

Using final to Prevent Overriding

While method overriding is one of Java’s most powerful features, there will be times when you will want to prevent it from occurring. To disallow a method from being overridden, specify final as a modifier at the start of its declaration. Methods declared as final cannot be overridden. The following fragment illustrates final: 

                               

Because meth () is declared as final, it cannot be overridden in B. If you attempt to do so, a compile-time error will result. 

Using final to Prevent Inheritance

Sometimes you will want to prevent a class from being inherited. To do this, precede the class declaration with final. Declaring a class as final implicitly declares all of its methods as final, too. As you might expect, it is illegal to declare a class as both abstract and final since an abstract class is incomplete by itself and relies upon its subclasses to provide complete implementations.
Here is an example of a final class: 

                                 

 As the comments imply, it is illegal for B to inherit A Since A is declared as final. 

The Object Class 

There is one special class, Object, defined by Java. All other classes are subclasses of Object. That is, Object is a superclass of all other classes. This means that a reference variable of type Object can refer to an object of any other class. Also, since arrays are implemented as classes, a variable of type Object can also refer to any array.
Object defines the following methods, which means that they are available in every object. 

                     

The methods getClass( ), notify( ), notifyAll( ), and wait( ) are declared as final. You may override the others. However, notice two methods now: equals( ) and toString( ). The equals( ) method compares the contents of two objects. It returns true if the objects are equivalent, and false otherwise.