#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 "."; } }