まあ結局は各クラス(ベースクラスから継承済)にて同じメソッド名がある場合なんですね〜
呼び出し側を変えなくていい、というのはその通りか。
結局はそれぞれのクラスのオブジェクトを生成して、メソッドを呼び出す必要があるならばそこまで便利なのか、実感が湧きません。
package com.company; import java.util.Scanner; class Car { public String name; public int wheels; public boolean engine; public int cylinders; public Car(String name, int cylinders) { this.name = name; this.wheels = 4; this.engine = true; this.cylinders = cylinders; } public void startEngine() { System.out.println("car can start driving"); } public String getName() { return name; } public int getCylinders() { return cylinders; } } class Polo extends Car { public Polo(String name, int cylinders) { super(name, cylinders); } @Override public void startEngine() { System.out.println("polo can start driving"); } } class Golf extends Car { public Golf(String name, int cylinders) { super(name, cylinders); } @Override public void startEngine() { System.out.println("golf can start driving"); } } class Beetle extends Car { public Beetle(String name, int cylinders) { super(name, cylinders); } @Override public void startEngine() { System.out.println("beetle can start driving"); } } public class Main { public static void main(String[] args) { Car theCar = returnObj(); theCar.startEngine(); System.out.println(theCar.getName()); System.out.println(theCar.getCylinders()); } public static Car returnObj() { Scanner scanner = new Scanner(System.in); if (scanner.hasNextInt()) { switch(scanner.nextInt()){ case 1: return new Polo("polo", 4); case 2: return new Golf("golf", 8); case 3: return new Beetle("beetle", 12); } System.out.println("invalid option"); scanner.close(); return null; } System.out.println("invalid option"); scanner.close(); return null; } }