Extending Classes and Super in Java

Let’s Dive into the Code

Vehicle.java file in folder path: K:\Extending Classes and Overriding Methods\com\example\java

package com.example.java;    import com.example.java.model.*;	//This imports all the files in model folder  import java.util.List;  import java.util.ArrayList;    public class Vehicle {  	public static void main( String[] args ){    		List<Bike> bikes = new ArrayList<>();    		//Instead of:  		//bikes.add(new Bike(Bike.HONDA, 0x2E0456, 1));  		//We do this as Honda knows all the values:  		bikes.add(new Honda());  		bikes.add(new Bike(Bike.YAMAHA, 0x2E0854, 1));  		bikes.add(new Bike(Bike.YAMAHA, 0x2E0555, 1));    		for(Bike b: bikes) {  		 	System.out.println(b.getName() +" " + b.getColor() + " " + b.getGearOrNot());  		}    	}  }

Bike.java file in folder path: K:\Extending Classes and Overriding Methods\com\example\java\model

package com.example.java.model;    public class Bike {    	public static final String HONDA = "Honda";  	public static final String YAMAHA = "Yamaha";    	private String name = HONDA;   	private long color = 0x2E0456;  	private int gearOrNot = 1;    	//Let's forget to create the default constructor  	//public Bike() {} //does nothing but must be defined and public    	public Bike(String name, long color, int gearOrNot) {  		this.name = name;   		this.color = color;  		this.gearOrNot = gearOrNot;  	}    	public String getName() { return name; }    	public long getColor() { return color; }    	public int getGearOrNot() { return gearOrNot; }    }

 Honda.java file in folder path: K:\Extending Classes and Overriding Methods\com\example\java\model

package com.example.java.model;    public class Honda extends Bike { //will give error. Need to define default constructor  	  	//public Honda() {} //will give error that still no default constructor exists    	public Honda() {  		super(Bike.HONDA, 0x2E0456, 1);  	}      }

 Execution

  • javac com\example\java\model\Bike.java
  • javac com\example\java\Vehicle.java
  • java com.example.java.Vehicle
  • Honda 3015766 1
  • Yamaha 3016788 1
  • Yamaha 3016021 1

Notes

  • Instead of explicitly setting name, color and gearOrNot variable, we created a special subclass Honda.
  • This subclass Honda already knows the values of name, color and gearOrNot.
  • The subclass (Honda) expects a no argument constructor in superclass (Bike).
  • Since, the no argument constructor does not exists, we need to create it explicitly in the subclass.
  • If we just define an empty default constructor in subclass, we get error again.
  • So we need to use the keyword ‘super’ to call a specific constructor from superclass.
  • super() needs to be first keyword in the definition.
  • This makes the code simpler and easier to read.
  • Now if there is a change in color then it needs to be done in subclass only and it will be reflected everywhere the subclass is instantiated.
  • Thus, subclass can contain specific information and override the default or set specific values which the superclass requires.