
Couple of days back I wrote an article on basic Java Fundamental on What is an Interface in Java and How it’s used? This tutorial is also related to basic Java fundamental “Abstract Class and Abstract Method
“.
What is an Abstract Class?
Let’s start understanding Abstract class first and then we will go over Example.
- An abstract class is a class that is declared
abstract
- Abstract classes cannot be instantiated
- Abstract classes can be subclassed
- It may or may not include abstract methods
- When an abstract class is
subclassed
, the subclass usually provides implementations for all of the abstract methods in its parent class - If subclass doesn’t provide implementations then the subclass must also be declared
abstract
.
This is a very basic Java Interview Question
. Probably the 1st Java Interview Question
you get during interview.
Can I define an abstract class without adding an abstract method?
Of course yes. Declaring a class abstract only means that you don’t allow it to be instantiated on its own. You can’t have an abstract method in a non-abstract class.
What is an Abstract Method?
- An
abstract method
is a method that is declared without an implementation. - It just has a method signature.
package crunchify.com.tutorial; /** * @author crunchify.com * Simple Abstract Class and Method Example with live result * */ public abstract class CrunchifyExam { public enum ExamStatus { PASSED, FAILED } private String examTime; private ExamStatus status; public CrunchifyExam(String examTime, ExamStatus status) { this.examTime = examTime; this.status = status; } public String getExamTime() { return examTime; } public void setExamTime(String examTime) { this.examTime = examTime; } public void setExamStatus(ExamStatus status) { this.status = status; } public ExamStatus getExamStatus() { return status; } abstract public void checkResult(); }
Let’s start with an Example. Problem Description:
- Create class
CrunchifyExam.java
, which has one abstract method calledcheckResult()
- Create class
Crunchify1stSchoolExamResult.java
, which extends Abstract classCrunchifyExam.java
- Create class
Crunchify2ndSchoolExamResult.java
, which extends Abstract classCrunchifyExam.java
- Now both above classes have to provide implementation for checkResult() method
- Both Schools may have their own different
procedure
ornumber of checks
to find out if user isPASSED or FAILED
, they are free to have their own implementation ofcheckResult()
Once you extend CrunchifyExam
class in Crunchify1stSchoolExamResult.java
– Eclipse will prompt you to implement Abstract methods mentioned in CrunchifyExam.java

Crunchify1stSchoolExamResult.java
package crunchify.com.tutorial; /** * @author crunchify.com */ public class Crunchify1stSchoolExamResult extends CrunchifyExam { public Crunchify1stSchoolExamResult(String examTime, ExamStatus status) { super(examTime, status); // TODO Auto-generated constructor stub } @Override public void checkResult() { String studentName = "Crunchify1"; String studentResult = "85%"; // School NO-1 will provide all their formula to find if user is passed or failed. // After detailed calculation let's say student's grade is "PASSED". System.out.println("Hey.. this is user " + studentName + " with grade " + studentResult + " - " + getExamStatus() + ", ExamTime: " + getExamTime()); } }
Crunchify2ndSchoolExamResult.java
package crunchify.com.tutorial; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; /** * @author crunchify.com */ public class Crunchify2ndSchoolExamResult extends CrunchifyExam { public Crunchify2ndSchoolExamResult(String examTime, ExamStatus status) { super(examTime, status); } @Override public void checkResult() { String studentName = "Crunchify2"; String studentResult = "45%"; // School NO-2 will provide all their formula to find if user is passed or failed. // After detailed calculation let's say student's grade is "FAILED". log("Hey.. this is user " + studentName + " with grade " + studentResult + " - " + getExamStatus() + ", ExamTime: " + getExamTime()); } public static void main(String args[]) { DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // 1st School's checkResult() Date date = new Date(); String examTime = dateFormat.format(date); log("Initializing 1st School object at time " + examTime); // We are setting up time and Result for 1st School Crunchify1stSchoolExamResult object = new Crunchify1stSchoolExamResult(examTime, ExamStatus.PASSED); object.checkResult(); // Let's wait 5 seconds wait to see time difference in console log try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // 2nd School's checkResult() date = new Date(); examTime = dateFormat.format(date); log("\nInitializing 2nd School object at time " + examTime); // We are setting up time and Result for 2nd School Crunchify2ndSchoolExamResult object2 = new Crunchify2ndSchoolExamResult(examTime, ExamStatus.FAILED); object2.checkResult(); } // Simple log method private static void log(String value) { System.out.println(value); } }
Eclipse Console Result:
Just right click on Crunchify2ndSchoolExamResult.java
and run as Java Application
to see below result.
Initializing 1st School object at time 2016/11/30 14:24:37 Hey.. this is user Crunchify1 with grade 85% - PASSED ExamTime: 2016/11/30 14:24:37 Initializing 2nd School object at time 2016/11/30 14:24:42 Hey.. this is user Crunchify2 with grade 45% - FAILED ExamTime: 2016/11/30 14:24:42
Now you may have a question
Why can’t I use Interface here rather than having Abstract Method
and Class
and have CrunchifyExam as an Interface?
Well – Sure you could
– but you’d also need to implement the getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
() methods.
By using abstract classes, you can inherit the implementation of other (non-abstract) methods. You can’t do that with interfaces – an interface cannot provide
any method implementations.
Is it possible to create abstract and final class in Java?
- The abstract and final are the mutually exclusive concept.
- So answer is NO, we can’t make an abstract class or method final in Java.
- Final class is complete class and can’t be extended further.
- Abstract class is called incomplete class and can be only extended by other concrete class and you have to implement all abstract methods.
- Also, there is no way and it’s not possible to have an abstract method in a final class.
Is it possible to inherit from multiple abstract classes in Java?
- Java does not support multiple inheritance.
- In java we can only Extend a single class.
- In Java we can implement Interfaces from many sources.
Very good article this is, i have read your article and i got know exact difference between abstract method and abstract class. You have explained it very well with easy example. Thanks a lot for sharing with us, will look forward to read more from you!
Thank you Pranit. I’m glad article helped you understand abstract method and abstract class.
Happy to help. Keep visiting.
Congratulation for best describetion of Abstract Class. I apreciate u from my heart, I study your code more than 2 ours. and learn every aspects. I get no need double writing of code: Thank u like u.
Thank you for nice words Md. Aminul. Happy coding.
where to call getExamTime() ? What is use of exam time?
Hi Nikita. It’s upto you how you would like to implement getExamTime() method. In above example I haven’t use it.
If you are declared with abstract keyword of a class is called abstract class. It can have abstract and non-abstract method (method with body).
That’s right Roy.
Defining an abstract class without any abstract methods is absolutely possible. Updated above tutorial which reflects your point.. Thanks for suggestion. Keep visiting and happy coding.
After reading this post its very easy to understand differ between Abstract Class and Abstract Method with the help of examples. I just say good points you shared.