Typecasting and inheritance.

public class Test {
    public static void main(String [] args) {
	Car mycar = new Car("Dodge",4,80.0,"automatic");
	mycar.print();
	int distance = 5000;
	System.out.println("It will travel " + distance + " miles in " +
			   mycar.time(distance) + " hours");
	Airplane plane = new Airplane("Airbus",200,1000,30000);
	plane.print();
	System.out.println("It will travel " + distance + " miles in " +
			   plane.time(distance) + " hours");

	// typecasting

	// is this legal?
	Vehicle v = new Car("Dodge",4,80.0,"automatic");
	// which method will be called? 
	v.print();

	// add a method getTransmission to Car
	// is this legal?
	//String trans = v.getTransmission();

	// typecasting: 
	String trans = ((Car) v).getTransmission();

	// store in a variable:
	Car c = (Car) v;
	trans = c.getTransmission();

	// is this legal?
	v = c;  // or could write v = (Vehicle) c;
	v.print();
	//trans = v.getTransmission();

	// what happens?
	// Airplane a = (Airplane) v;

	Vehicle [] vehicles = {mycar, plane, new Vehicle("bike", 1, 20)};
	
	for (Vehicle v1 : vehicles) {
	    v1.print();
	    System.out.println("covers 100 miles in " + v1.time(100) + " hours");
	}

	// instanceof:
	System.out.println(mycar instanceof Vehicle);
	System.out.println(mycar instanceof Car);
	//System.out.println(mycar instanceof Airplane);
	System.out.println(mycar instanceof Object);
	System.out.println(vehicles[2] instanceof Car);

	// which methods are considered the same for the purpose 
	// of overwriting? 
    }
}


public class Vehicle {
    protected String model;
    protected int maxPassengers;
    protected double maxSpeed;  // mph

    public Vehicle(String m, int passengers, double speed) {
	model = m;
	maxPassengers = passengers;
	maxSpeed = speed;
    }

    // takes distance in miles, returns time in hours
    public double time(double distance) {
	return distance/maxSpeed;
    }
	

    public void print() {
	System.out.println("this is a " + model + ", it can carry " +
			   maxPassengers + " and can travel at " +
			   maxSpeed + " mph");
    }
}



public class Car extends Vehicle {
    private String transmissionType;

    public Car(String m, int passengers, double speed, String transmission) {
	super(m,passengers,speed);
	transmissionType = transmission;
    }

    public void print() {
	super.print();
	System.out.println("It has " + transmissionType + " transmission");
    }

    public String getTransmission() {
	return transmissionType;
    }
}



public class Airplane extends Vehicle {
    private int maxAltitude;

    public Airplane(String m, int passengers, double speed, int altitude) {
	super(m,passengers,speed);
	maxAltitude = altitude;
    }

    public void print() {
	super.print();
	System.out.println("It's maximum altitude is " + maxAltitude);
    }
}

This is an example from CSci 2101 course.