[Link].
06.08.2024 Utilizing Interfaces, Abstract Classes, and Polymorphism for
Electricity Bill Management in Java
71762305061
AIM:
To implement and demonstrate the concept of abstract classes and polymorphism
in Java by creating an electricity bill management system that calculates the bill for residential
and commercial customers based on their electricity consumption and other parameters.
PROGRAM:
import [Link].*;
interface Billable {
double TAX_RATE = 0.10;
double LATE_FEE = 15.0;
double COMMERCIAL_MINIMUM_CHARGE = 100.0;
double RESIDENTIAL_HIGH_CONSUMPTION_THRESHOLD = 300.0;
double RESIDENTIAL_HIGH_CONSUMPTION_RATE = 0.20;
double COMMERCIAL_EXTRA_CONSUMPTION_LIMIT = 1000.0;
double COMMERCIAL_PENALTY_RATE = 0.10;
double calculateBill();
String getBillDetails();
double getTotalTax();
double getLatePaymentFee();
public class ElectricityBillManagement{
public abstract static class ElectricityBill implements Billable {
protected String customerID;
protected double unitsConsumed;
protected boolean isPaidOnTime;
public ElectricityBill(String customerID, double unitsConsumed, boolean isPaidOnTime) {
[Link] = customerID;
[Link] = unitsConsumed;
[Link] = isPaidOnTime;
public abstract double calculateBill();
public String getBillDetails() {
double totalBill = calculateBill();
double tax = getTotalTax(totalBill);
double lateFee = getLatePaymentFee();
return [Link]("Customer ID: %s%nUnits Consumed: %.2f%nBase Bill: %.2f%nTax:
%.2f%nLate Fee: %.2f%nTotal Amount Due: %.2f",customerID,
unitsConsumed, totalBill, tax, lateFee, totalBill + tax + lateFee);
public double getTotalTax(double totalBill) {
return totalBill * TAX_RATE;
public double getLatePaymentFee() {
return isPaidOnTime ? 0.0 : LATE_FEE;
public static class ResidentialBill extends ElectricityBill {
private double discountRate;
public ResidentialBill(String customerID, double unitsConsumed, boolean isPaidOnTime, double
discountRate) {
super(customerID, unitsConsumed, isPaidOnTime);
[Link] = discountRate;
}
public double calculateBill() {
double baseRate = 0.15;
double baseBill;
if (unitsConsumed > RESIDENTIAL_HIGH_CONSUMPTION_THRESHOLD) {
baseBill = (RESIDENTIAL_HIGH_CONSUMPTION_THRESHOLD * baseRate)
+ ((unitsConsumed - RESIDENTIAL_HIGH_CONSUMPTION_THRESHOLD) *
RESIDENTIAL_HIGH_CONSUMPTION_RATE);
} else {
baseBill = unitsConsumed * baseRate;
double totalBill = baseBill - (baseBill * discountRate);
return totalBill;
public String getDiscountDetails() {
return [Link]("Discount Rate: %.2f%%", discountRate * 100);
public double getTotalTax() {
return 0;
public static class CommercialBill extends ElectricityBill {
private double additionalChargePerUnit;
private double minimumCharge;
public CommercialBill(String customerID, double unitsConsumed, boolean isPaidOnTime, double
additionalChargePerUnit, double minimumCharge) {
super(customerID, unitsConsumed, isPaidOnTime);
[Link] = additionalChargePerUnit;
[Link] = minimumCharge;
}
public double calculateBill() {
double baseRate = 0.25;
double baseBill = unitsConsumed * baseRate;
double additionalCharges = unitsConsumed * additionalChargePerUnit;
double penalty = (unitsConsumed > COMMERCIAL_EXTRA_CONSUMPTION_LIMIT)
? (unitsConsumed - COMMERCIAL_EXTRA_CONSUMPTION_LIMIT) *
COMMERCIAL_PENALTY_RATE: 0.0;
double totalBill = baseBill + additionalCharges + penalty;
double finalBill = [Link](totalBill, COMMERCIAL_MINIMUM_CHARGE);
return finalBill;
public String getAdditionalChargeDetails() {
return [Link]("Additional Charge Per Unit: %.2f%nMinimum Charge: %.2f",
additionalChargePerUnit, minimumCharge);
public double getTotalTax() {
return 0;
public static void main(String[] args) {
Scanner In = new Scanner([Link]);
String Id;
double units;
boolean paid;
double discount;
double additional,minimum;
[Link]("ENTER UT CHOICE 1-RESIDENTIAL BILL 2-COMMERCIAL BILL");
int ch = [Link]();
switch(ch) {
case 1:
[Link]("ENTER UR CUSTOMER ID : ");
Id = [Link]();
[Link]("ENTER THE NUMBER OF UNITS CONSUMED: ");
units = [Link]();
[Link]("ENTER true IF PAID ON TIME, false IF NOT PAID ");
paid =[Link]();
[Link]("ENTER THE DISCOUNT PERCENTAGE: ");
discount = [Link]();
ResidentialBill residentialBill = new ResidentialBill(Id,units,paid,discount);
[Link]([Link]());
[Link]([Link]());
break;
case 2:
[Link]("ENTER UR CUSTOMER ID : ");
Id = [Link]();
[Link]("ENTER THE NUMBER OF UNITS CONSUMED: ");
units = [Link]();
[Link]("ENTER true IF PAID ON TIME, false IF NOT PAID ");
paid =[Link]();
[Link]("ENTER THE ADDITIONAL CHARGE : ");
additional = [Link]();
[Link]("ENTER THE MINIMUM CHARG: ");
minimum = [Link]();
CommercialBill commercialBill = new CommercialBill(Id,units,paid,additional,minimum);
[Link]([Link]());
[Link]([Link]());
break;
default:
[Link]("INVALID!!!!!!!!!!!");
[Link]();
Output :
RESULT:
The program successfully demonstrates the use of abstract classes and polymorphism in
Java to calculate electricity bills for residential and commercial customers based on
different parameters.