Java — неправильное создание подклассов и суперклассов

#java #inheritance #polymorphism #subclass #superclass

Вопрос:

Во-первых, я думаю, что название этого поста могло бы быть лучше, поэтому, если вы хотите отредактировать его, не стесняйтесь это делать (или дайте мне знать, как, по вашему мнению, я должен его отредактировать).

Я рассматриваю практические задачи для интервью на Java. Я сейчас не даю интервью, но я думаю, что это лучший способ для меня найти все мои слабые места в Java. И прежде чем вы это скажете, да, я нахожу, что я ОЧЕНЬ слаб во многих областях Java и что мне нужно будет многое сделать или просмотреть перед собеседованием.

У меня есть несколько вопросов по поводу следующего кода:

 public class VehicleApp {   public static void main(String[] args) {  Ford myFord = new Ford();  System.out.println(myFord.countWheels());    Kawasaki myKawasaki = new Kawasaki(1985, "Eliminator");  System.out.println(myKawasaki.countWheels());  } }  class Vehicle {   protected String make;  protected int numWheels;   public Vehicle() { }   public String countWheels() {  return "The number of wheels this "   make   " has is "   numWheels   ".";  } }  class Ford extends Vehicle {  public Ford() {  make = "Ford";  numWheels = 4;  } }  class Kawasaki extends Vehicle {  private String model;  private int year;   public Kawasaki(int year, String model) {  make = "Kawasaki";  numWheels = 2;  this.model = model;  this.year = year;  }   public String countWheels() {  return "The number of wheels this "   year   " "   make   " "   model   " has is "   numWheels   ".";  } }  

Во-первых, я замечаю, что в коде нет ссылок на super (). Я думал, что когда вы имеете дело с суперклассами и подклассами, требуется, чтобы конструктор подкласса включал ссылку на конструктор суперкласса в форме super(); (и включал параметры, если они есть у конструктора суперкласса). Тем не менее, этот код, похоже, работает и без них. Не ошибаюсь ли я в этом требовании? Я что-то еще упускаю на этой картинке?

Во-вторых, класс Kawasaki не включает переопределение @decoration для метода countWheels (). Поскольку этот метод имеет то же имя (хотя и другие параметры), что и метод countWheels() суперкласса, не потребуется ли оформление @Override? Или это только в том случае, если параметры одного типа и одного порядка?

Спасибо!

Ответ №1:

Если вы явно не вызываете super() производный класс, компилятор Java автоматически сгенерирует super() для вас вызов. Но это, конечно, работает только в том случае, если конструктор базового класса не принимает аргументов. Это можно продемонстрировать, добавив System.out.println("Constructor called."); инструкцию в ваш пустой Vehicle конструктор.

@Override Декоратор, как вы уже выяснили, но не убедили себя в этом, является необязательным. Но считается «лучшей практикой» использовать это при переопределении метода для обнаружения ошибок, если вы измените сигнатуру метода.

Единственное, надеюсь, конструктивное замечание, которое я бы сделал, состоит в том, что, поскольку у a Vehicle должны быть атрибуты make и numWheels, я лично потребовал бы, чтобы они были указаны в Vehicle конструкторе. Теперь нет возможности иметь производный класс с этими неопределенными атрибутами.

 public class VehicleApp {   public static void main(String[] args) {  Ford myFord = new Ford();  System.out.println(myFord.countWheels());   Kawasaki myKawasaki = new Kawasaki(1985, "Eliminator");  System.out.println(myKawasaki.countWheels());  } }  class Vehicle {   protected String make;  protected int numWheels;   public Vehicle(String make, int numWheels) {  this.make = make;  this.numWheels = numWheels;  }   public String countWheels() {  return "The number of wheels this "   make   " has is "   numWheels   ".";  } }  class Ford extends Vehicle {  public Ford() {  super("Ford", 4);  } }  class Kawasaki extends Vehicle {  private String model;  private int year;   public Kawasaki(int year, String model) {  super("Kawasaki", 2);  this.model = model;  this.year = year;  }   @Override  public String countWheels() {  return "The number of wheels this "   year   " "   make   " "   model   " has is "   numWheels   ".";  } }