Saturday, 4 January 2014

Difference between data encapsulation and data abstraction in java.

Four important concepts or principles in Java are

Data encapsulation

Data abstraction

Inheritance

Polymorphism

In this post we will look at first two principles - Encapsulation and Abstraction.

General View

Data Encapsulation simply means wrapping relevant data together where as Data abstraction means abstracting out the the underneath logic and expose only the relevant part to the user. This is very generic statement. We will get back to the what it actually means in Java language.

Data Encapsulation in Java

Java is an Object oriented programming language, That means everything in java is an object and these objects interact with each other to form an executing program. Classes are nothing but blueprints of Objects and these classes form the very basis of Data encapsulation.

Data encapsulation in it's simple form means wrapping the relevant data in a class and controlling it's access. This is also sometimes associated with another keyword - Data Hiding . When we design the class we essentially write encapsulation rules.Lets us go a little deeper to understand this concept -

We define functions or variables with some access modifier to control the extent of scope that can be used or accessed by the user. Common examples are declaring a variable private and giving its access using getter and setter methods or declaring a method private if it's only use is withing the class.

This is also why it is referred to as data hiding. We hide the the data and provide only desired access to it.

Note : Keywords encapsulation and data hiding are used
synonymously everywhere. It should not be misunderstood that
encapsulation is all about data hiding only. When we say encapsulation,
emphasis should be on grouping or packaging or bundling related data and
behavior together.

Data Abstraction in Java

Data abstraction simply means generalizing something to hide the complex logic that goes underneath. Consider a very simple example of computer science - subtraction. If we have two variables "a" and "b" we simply say their subtraction is (a-b). But what is really happening behind the scenes. These variables are stored in main memory in binary format. Processor processes the subtract information which really takes place using two's complement method. Again in processor we have gates that actually carry out the procession. Even inside gates there are pins and 1 and 0 simple means high and low signals.

Even though the process is so complex underneath a normal software developer developing some financial application need not know every small detail. This is because the concept has been abstracted out. This is what abstraction means in a general terminology.

We only expose the method signature to the user. All user needs to know is what input or parameters he must supply to the function and what is the desired output or return value.

Lets us take an example to understand this function -

Lets say we have an interface Animal and it has a function makeSound(). There are two concrete classes Dog and Cat that implement this interface. These concrete classes have separate implementations of makeSound() function. Now lets say we have a animal(We get this from some external module). All user knows is that the object that it is receiving is some Animal and it is the users responsibility to print the animal sound. One brute force way is to check the object received to identify it's type, then typecast it to that Animal type and then call makeSound() on it. But a neater way is to abstracts thing out. Use Animal as a polymorphic reference and call makeSound() on it. At runtime depending on what the real Object type is proper function will be invoked.

I would like to end this post by saying Data encapsulation(Data hiding) is wrapping and controlling access of logically related data in a class. One of the aspect of this is by using suitable access modifiers. Data abstraction on the other hand is generalizing the concept so that the underlying complex logic is hidden from the user. In java this is achieved by using interfaces and abstract classes.

Encapsulation is combining related logic data (variables and methods) where as Abstraction is hiding internal implementation details and expose only relevant details to the user. In a way you can Abstraction is achieved by Encapsulation.
A generic diagram to understand the difference is provided below. Note complex logic is in the circuit board which is encapsulated in a touchpad and a nice interface(buttons) is provided to abstract it out.