0

Помогите пожалуйста разобраться с заданием. Я только начал изучать язык JAVA и пока с этим есть некоторые трудности Суть задачи:

Задание А:

Создать интерфейс Run, для описания транспорта. Интерфейс должен иметь в себе следующие методы:

1.Метод вывода имени транспортного средства. 2.Метод получения скорости передвижения транспорта 3.Метод получения массы транспорта 4.Метод получения количества пассажиров 5.Метод получения количества колес транспорта

Вот код который я написал

public interface Run {
         double getMassBus();   
         double getBusSpeed();  
         int getPassengers();   
         int getWheelAmount(); 
         String getBusInfo();  
}

Задание Б:

Создать абстрактный класс Mashine, который реализует интерфейс Run. В данном классе реализовать:

1.Константу максимальной скорости

2.Константу минимальной скорости

3.Константу минимального количества пассажиров

4.Константу максимального количества пассажиров

5.Поле с названием транспорта

6.Поле со скоростью передвижения транспорта в данный момент времени

7.Конструктор класса Mаshinе (String name, int speed)

8.Метод вывода информации о транспорте

Вот что удалось сделать

public abstract class Machine implements Run {
final int maxSpeed = 120;   //Константа максимальної швидкості
final int minSpeed = 5;     //Константа мінімальної швидкості
final int maxPasAmount = 30;    //Максимальна к-сть пасажирів
final int minPasAmount = 1;     //Мінімальна к-сть пасажирів

public String busName;      //Поле з назвою транспортного засобу
public double presentSpeed;    //Поле швидкості пересування в даний момент

//Конструктор класу Machine
public Machine(String name, double speed){
    this.presentSpeed = speed;
    this.busName = name;
}

//Реалізація методів з інтерфейсу
abstract public int getWheelAmount();
abstract public int getPassengers();
abstract public double getMassBus();

@Override
public double getBusSpeed(){
    return presentSpeed;
}
@Override
public String getBusInfo(){
    return "Назва " + busName + "\nМакс. шв: " + maxSpeed + "\nМін. шв: " + minSpeed + "\nМакс. к-сть пасажирів: " + maxPasAmount + "\nМін. к-сть пасажирів: " + minPasAmount;
}

}

Задание В: На котором все и встало

Создать супер класс "Автобус". От заданного супер класса создать двух прямых потомков "Городской" и "Междугородний двухэтажный". Потомки должны реализовывать все методы, какие нереализованные в абстрактном классе. Данные методы должны выводить на экран информацию о транспорте.

Вот до чего дошел:

   public class Bus extends Machine{
    private int wheels, amount;
    private double mass;
    //конструктор
    public Bus(String name, double speed, int wheels, int amount, double mass) {
        super(name, speed);
        this.wheels = wheels;
        this.amount = amount;
        this.mass = mass;
    }
    //методы
    @Override
    public int getWheelAmount(){
        return wheels;
    }
    @Override
    public int getPassengers(){
        return amount;
    }
    @Override
    public double getMassBus(){
        return mass;
    }
}

Задание Г:

Создать демонстрационный класс, в котором создаются экземпляры обоих потомков, и производится вызов методов для вывода информации о наше транспорте.

ПРАВИЛЬНО ЛИ БЫЛО РЕАЛИЗОВЫВАТЬ ВСЕ МЕТОДЫ ИЗ ИНТЕРФЕЙСА В АБСТРАКТЕ ИЛИ ПО ЗАДАНИЮ, ЛУЧШЕ СДЕЛАТЬ ИХ В ПОТОМКАХ? ПОМОГИТЕ, ПОЖАЛУЙСТА ИСПРАВИТЬ НЕДОЧЕТЫ В ПЕРВЫХ ДВУХ ЗАДАНИЯХ И ДОДЕЛАТЬ В И Г. бОЛЬШОЕ ВАМ, ЗАРАНЕЕ, СПАСИБО

Glechik
  • 370
  • 1
    во первых, если вы хотите что-то получить, то название метода должно начинать с get, например getMassBus() – danilshik Mar 16 '19 at 18:58
  • @danilshik, спасибо, подправил и дописал новое – Glechik Mar 16 '19 at 19:03
  • @danilshik, к сожалению, к ним не дошел. Если можете - посмотрите, правильно ли по заданиям сделан уже существующий код, если да, то помогите доделать дальше))) – Glechik Mar 16 '19 at 19:12
  • На самом деле у тебя все стало ещё на задании Б. Вот почитай здесь. – Roman C Mar 16 '19 at 19:42
  • @GinTasan Да, еще актуально, ибо я малек запутался. Можете помочь? пока жду ответа попробую что-то надумать. За любую помощь буду благодарен – Glechik Mar 16 '19 at 22:42
  • @GinTasan Меня все еще смущает исполнение задания В, так как аргументы из методов убрались. И нужно ли кроме аргументов speed и name прописывать в конструктор bus? – Glechik Mar 16 '19 at 22:47
  • Необязательно, у вас в задании такого нет, такие вещи решаются в зависимости от задачи, которая стоит в проекте, если это всего лишь примеры, которые надо сделать, то ничего страшного. А геттеры должны возвращать значения из классов, это нормально, это исполнение ООП свойства инкапсуляции, есть еще сеттеры, но раз в задании такого нет - это не важно. Задавайте еще вопросы, могу код написать и скинуть вам, если нужно – GinTasan Mar 16 '19 at 22:56
  • @GinTasan, да, кодом бы крайне помогли. Хотя бы имел бы пример нормальной работы и имел с чем свериться. Я все-таки объявил переменные для гетеров в классе Bus, сейчас обновлю код в вопросе – Glechik Mar 16 '19 at 23:05
  • Скоро код будет. А так, заметил в Б задании getBusSpeed() , в условии не написано, что его реализовать надо – GinTasan Mar 16 '19 at 23:21
  • @GinTasan Он есть в задании А (в интерфейсе), я не смог нормально передать его в класс Bus и, почему то, решил, что смогу передать в абстрактный класс. Понимаю, что это ошибка, но пока не соображаю. Жду примера дабы разобрать код толкового человека) – Glechik Mar 16 '19 at 23:24

2 Answers2

3

Методы получения чего-либо (геттеры) должны быть без аргументов.

данном классе реализовать:

...

Метод вывода информации о транспорте

не реализовали.

Данные методы должны выводить на экран информацию о транспорте.

они у вас ничего не выводят


В абстрактном классе нужно реализовать методы, которые будут иметь одинаковую логику у всех потомков. А в дочерних классов можно переопредилить методы имеющие разную логику. Например getBusInfo().

Для того чтобы реализоваь метод абстрактного класса надо убрать слово abstract, и добавить ему логики. В вашем случае надо просто вырезать весь метод getBusInfo() включая @Override из класса Bus и переместить его в класс Machine
Для того чтобы переопределить родительский метод достаточно просто переписать его тело (то что находиться в фигурных скобочках) в дочернем классе
Например

//это переопределенный метод, с другой логикой
@Override
public String getBusInfo(){
   return "Я Городской автобус!";
}
  • Спасибо за совет, часть из него, я смогу реализовать сам. Но простите, я потому и написал, что бы знающие люди проверили и подсказали. К сожалению, пока не очень понимаю, как реализовать методы в абстракте, а какие в потомках от класса Bus. Если вас не затруднит помочь новичку в этом вопросе, то буду крайне благодарен – Glechik Mar 16 '19 at 19:35
  • Методы в абстрактном классе лучше оставить также абстрактными, поскольку врядли какое-то поведение можно "обобщить" для всех классов-наследников. –  Mar 16 '19 at 19:39
  • @ОлексійМоренець, Хорошо, я убрал из гетеров все аргументы. На сколко я понимаю, в абстрактном классе методы объявлены абстрактными, или я чего-то не понимаю? – Glechik Mar 16 '19 at 19:42
  • @ОлексійМоренець там в задании написано реализовать 1 абстрактный метод, так что это в любом случае надо будет – Cyber Doge Mar 16 '19 at 19:46
  • @ЮрийГалай , да в абстрактном классе могут быть абстрактные методы, но это не обязательно – Cyber Doge Mar 16 '19 at 19:47
  • То есть, мне нужно убрать из АБСТРАКТНОГО класса MACHINE метод abstract public String getBusInfo(); и на его место вставить @Override public String getBusInfo(){ return "Назва " + busName + "\nМакс. шв: " + maxSpeed + "\nМін. шв: " + minSpeed + "\nМакс. к-сть пасажирів: " + maxPasAmount + "\nМін. к-сть пасажирів: " + minPasAmount; } . Простите если туплю, но я уже запутался почти в край))) – Glechik Mar 16 '19 at 19:49
  • да,именно это в задании это требуется сделать – Cyber Doge Mar 16 '19 at 19:50
  • хорошо, где еще есть ошибки? Как реализовать задания В и Г? Я внес правки в вопрос – Glechik Mar 16 '19 at 19:52
  • 1
    Ну в В надо создать 2 класса и наследовать их от Bus. Но на самом деле я не могу понять что имелось в виду "создать супер класс и реализовать у наследников этого класса абстрактные методы". У супер класса нет абстрактных методов, так что реализовывать его потомкам нечего. Возможно имелось ввиду переопределить методы (очень некорректное задание). Ну а в Г надо просто создать класс (допустим Main), создать у него метод main, в нем надо создать объекты 2 автобусов и вызвать у них методы – Cyber Doge Mar 16 '19 at 20:00
  • У меня выводит ошибку в задании В, Что должны возвращать методы из задания В? – Glechik Mar 16 '19 at 20:06
  • добавь пременную speed – Cyber Doge Mar 16 '19 at 20:08
  • В конструктор переменная speed попадает через super из абстрактного класса. Мне просто в Bus создать еще одну переменную speed? – Glechik Mar 16 '19 at 20:10
2

Рабочий код, объект , конечно создавать в другом классе, не всегда правильно, ибо создает зависимости в коде, однако так написано в задании. Вот код с геттерами и сеттерами. Все задание сделано.

 interface Run{
double getMassBus();
double getBusSpeed();
int getPassengers();
int getWheelAmount();
String getBusInfo();

//Сеттеры void setMassBus(double Mass); void setBusSpeed(double Speed); void setPassengers(int Pass); void setWheelAmount(int Wheels); // } abstract class Machine implements Run{ private final int maxSpeed =120; private final int minSpeed =5; private final int maxPasAmount =30; private final int minPasAmount =1;

private String busName; private double presentSpeed;

protected Machine(String name,double speed){ this.presentSpeed = speed; this.busName = name; }

abstract public double getMassBus(); abstract public double getBusSpeed(); abstract public int getPassengers(); abstract public int getWheelAmount(); //Cеттеры abstract public void setMassBus(double Mass); abstract public void setBusSpeed(double Speed); abstract public void setPassengers(int Pass); abstract public void setWheelAmount(int Wheels); // @Override public String getBusInfo(){ return "Название транспорта: " + busName + " ,Скорость транспорта: " + presentSpeed; }

  }

class Bus extends Machine{ protected Bus(String name,double speed){ super(name,speed); } private double Mass; private int Pass; private double Speed; private int Wheels; @Override public double getMassBus(){return Mass;} @Override public double getBusSpeed(){return Speed;} @Override public int getPassengers(){return Pass;} @Override public int getWheelAmount(){return Wheels;} //Cеттеры @Override public void setMassBus(double Mass){this.Mass = Mass;}; @Override public void setBusSpeed(double Speed){this.Speed = Speed;}; @Override public void setPassengers(int Pass){this.Pass = Pass;}; @Override public void setWheelAmount(int Wheels){this.Wheels = Wheels;}; // }

class CityBus extends Bus{ public CityBus(String name,double speed){super(name,speed);}

} class InterCityBus extends Bus{ public InterCityBus(String name,double speed){super(name,speed);}

} class Demo{ public CityBus getCityBus(){ CityBus CB = new CityBus("Газель",50); CB.setMassBus(500); CB.setPassengers(20); CB.setWheelAmount(4); CB.setBusSpeed(70); return CB;} public void getInfoCityBus(CityBus s){ System.out.println("Для Городского автобуса - "+s.getBusInfo() + " Масса: " +s.getMassBus()+ " Скорость:" + s.getBusSpeed() + " Пассажиры: " + s.getPassengers()+ " Колеса: " +s.getWheelAmount() ); } public InterCityBus getInterCityBus(){ InterCityBus CB = new InterCityBus("Такси",60); CB.setMassBus(200); CB.setPassengers(4); CB.setWheelAmount(4); CB.setBusSpeed(100); return CB;} public void getInfoInterCityBus(InterCityBus s){ System.out.println("Для Межгороднего автобуса - "+s.getBusInfo() + " Масса: " +s.getMassBus()+ " Скорость:" + s.getBusSpeed() + " Пассажиры: " + s.getPassengers()+ " Колеса: " +s.getWheelAmount() ); } } class qwer{

public static void main(String[] srgs){ Demo demo = new Demo(); CityBus cb = demo.getCityBus(); InterCityBus icb = demo.getInterCityBus(); demo.getInfoCityBus(cb); demo.getInfoInterCityBus(icb);

} }

GinTasan
  • 1,159
  • Огромное вам спасибо, сам бы ещё долго разбирался, а теперь хоть нормальный пример есть. Спасибо, большое – Glechik Mar 17 '19 at 07:39
  • 1
    Не за что , обращайтесь ) – GinTasan Mar 17 '19 at 08:58
  • Да, и еще. Не будет ли вам сложно подсказать хороший материал для обучения? Мало ли, может знаете. Либо любой другой совет по изучению – Glechik Mar 17 '19 at 09:54
  • 1
    @ЮрийГалай, По java есть Герберт Шилдт Java 8 Полное Руководство и руководство для начинающих(2015) - это если вы новичок в этом, смотрите вопросы по собеседованиям - jsehelper.blogspot.com/2016/01/blog-post_59.html , очень помогает для того, что бы адаптироваться под различные тонкости работы основ java, дальше начнете понимать куда идти, и что читать, очень важная вещь - паттерны и принципы программирования - ОЧЕНЬ важная часть программирования. – GinTasan Mar 17 '19 at 12:05
  • 1
    Есть книга Боба Мартина «Чистый код» , так же есть Java. Эффективное программирование. Джошуа Блох, в ссылке на вопросы на собеседование есть вопросы и о паттернах и о принциппах, но вот еще -javarush.ru/groups/posts/496-patternih-proektirovanija-v-java , javarush.ru/groups/posts/584-patternih-proektirovanija , и в добавочку - dou.ua/lenta/articles/senior-java-tips , удачи в изучении ) – GinTasan Mar 17 '19 at 12:05
  • 1
    @ЮрийГалай обращайтесь ) – GinTasan Mar 17 '19 at 12:06