Не проходит тестирование com.javarush.test.level12.lesson09.task05

Привет!
Почему не проходит тестирование?


package com.javarush.test.level12.lesson09.task05;

/* Класс Human и интерфейсы Run, Swim
Напиши public класс Human(человек) и  public интерфейсы Run(бежать/ездить), Swim(плавать).
Добавь в каждый интерфейс по одному методу.
Добавь эти интерфейсы классу Human, но не реализуй методы.
Объяви класс Human абстрактным.
*/

public class Solution
{
    public static void main(String[] args)
    {

    }

    //add public interfaces and public class here - добавь public интерфейсы и public класс тут

    public interface Run {
        public void run();
    }

    public interface Swim {
        public void swim();
    }

    public abstract class Humen implements Run, Swim
    {

    }
}

Не проходит тестирование com.javarush.test.level12.lesson09.task05

Почему не проходит тестирование?


package com.javarush.test.level12.lesson09.task05;

/* Класс Human и интерфейсы Run, Swim
Напиши public класс Human(человек) и  public интерфейсы Run(бежать/ездить), Swim(плавать).
Добавь в каждый интерфейс по одному методу.
Добавь эти интерфейсы классу Human, но не реализуй методы.
Объяви класс Human абстрактным.
*/

public class Solution
{
    public static void main(String[] args)
    {

    }

    //add public interfaces and public class here - добавь public интерфейсы и public класс тут

    public interface Run {
        public void run();
    }

    public interface Swim {
        public void swim();
    }

    public abstract class Humen implements Run, Swim
    {

    }
}

level14.lesson08.home03 условия задачи и комменты сбивают с толку

Условия задачи расписаны по пунктам «что нужно сделать в программе», а не «что ДОЛЖНА делать программа». Лично меня (и не только, судя по предыдущим топикам) это надолго сбило столку.

Интерфейсы - маркеры

Интерфейсы — маркеры — это такой шаблон проектирования с проверкой
типов во время выполнения, который позволяет связать интерфейс и класс.
Чтобы понять для чего это может быть нужно рассмотрим
пример маркирования класса Serializible маркером.

Предположим, что нам понадобилось сохранить состояние объекта в памяти, а потом
еще и иметь воззможность расшифровать то, что мы сохранили. Тогда, скажите вы, можно
перевести наш объект в набор битов. Верно.

Мы можем использоватьпростой способ записи в файл с помощью FileInputStream, но это
удобно только если объектов мало, а что если их много?
Для этого есть чудесный инструмент сериализации.
Главное правило, когда вы им пользуетесь — сериализуемый объект должен
содержать в себе все данные, а не ссылаться на другие объекты.

Смотрите на свой класс " Ага, не ссылаются поля и хорошо поставлю маркер Serializable".
А когда поставите, это будет значить, что объекты, которые вы пометили могут быть записаны
в ObjectOutputStream. У класса ObjectOutputStream есть метод writeObject0(),
а в нем находятся проверки instanceof, проверяющие можно ли записывать объект и если вся серия проверок проваливается, то выбрасывается исключение NotSerializableException, а если нет- все аккуратненько пишется в память.

Создадим класс BigObject, экземпляры которого будем сериализовывать


    package post1;
    import java.io.Serializable;

    public class BigObject implements Serializable {

        private int id;
        public void setId(final int id){
            this.id = id;
        }

        public int getId() {
           return id;
        }
    }


Класс BigObject уже помечен как Serializable. У него есть одно поле id и сопутствующие методы get/set.

package post1;
    import post1.BigObject;
    import java.io.*;
    
    public class InterfaceMarker  {

        public static void main(String[] args) throws IOException, ClassNotFoundException {
            int originalId = 12;
            BigObject objectOriginal = new BigObject();
            objectOriginal.setId(originalId);
            ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
            ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
            outputStream.writeObject(objectOriginal);
            outputStream.close();

            byte[] buffer = writeBuffer.toByteArray();
            ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
            ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
            BigObject objectCopy = (BigObject)inputStream.readObject();
            if (objectCopy.getId() == originalId)
                System.out.println( "originalId equals copiedId");
        }
    }

Запись объекта


В начале создаем объект сериализируемого класса BigObject, затем готовим под него буфер данных — место куда все бантики будем складывать ByteArrayOutputStream. Затем готовим уже упомянутый ObjectOutputStream и передаем ему буфер.Записываем наш объект в поток и закрываем его.

Чтение объекта


Подготовим буфер записи readBuffer, передадим inputStream, прочтем readObject(). Теперь объект восстановлен.

Благодаря тому, что поле `id` не являлось ссылкой, мы смогли пометить Serializable класс, который полностью содержит в себе свои данные. Вместо того, чтобы добавлять функции проверки внутри нашего класса маркеры позволяют упростить процедуру валидации классов.
  • ,

Проектирование Классов и Интерфейсов (Перевод статьи)

Исходная статья: www.javacodegeeks.com/2015/09/how-to-design-classes-and-interfaces.html

Эта статья является частью нашего Курса Академии под названием «Продвинутая Java».
Этот курс призван помочь вам наиболее эффективно использовать Java. В нем обсуждаются передовые темы, такие как создание объекта, взаимосовместимость(параллелизм), преобразование в последовательную форму, отражение и многое другое. Это будет вашим путеводителем в вашем путешествии к мастерству в Java. Убедись сам!


Содержание

  1. Введение
  2. Интерфейсы
  3. Интерфейс-маркеры
  4. Функциональные интерфейсы, статические методы и методы по умолчанию
  5. Абстрактные классы
  6. Неизменяемые (постоянные) классы
  7. Анонимные классы
  8. Видимость
  9. Наследование
  10. Множественное наследование
  11. Наследование и композиция
  12. Инкапсуляция
  13. Final классы и методы
  14. Что дальше
  15. Скачать исходный код

  • ,

level13.lesson11.home05, вопрос по интерфейсам

public static DBObject NEO = new User().initializeIdAndName(1, "Neo");
...
    interface DBObject
    {
        DBObject initializeIdAndName(long id, String name);
    }

    static class User implements DBObject
    {
        long id;
        String name;

        @Override
        public DBObject initializeIdAndName(long id, String name)
        {
            this.id = id;
            this.name = name;
            return this;
        }
        ...
    }

насколько я знаю, нельзя создать объект интерфейса, а можно только класса.
в данном случае мы создаем объект класса User, и кладем ссылочку на него в переменную с типом DBObject (в чем преимущество в данном случае?) и вызываем метод инициализации. Теперь вопрос по нему. Записали id, записали name, тут без проблем. И возвращаем this (как я понимаю, это ссылка типа User), но наш метод возвращает типа DBObject. Я понимаю, что тут какой-то «замут» с полиморфизмом и с приведением типов (от более узкого User к более абстрактному/общему DBObject), но что именно происходит — не понимаю. Кому не сложно — объясните пожалуйста.
Про полиморфизм и приведение типов читал и в лекциях джавараш, и в Философии джава, но понимание полной картины не пришло))
  • ,

level12.lesson12.bonus03

Задачу решил. Но не понял вот эту конструкцию:
public static class Pair<X, Y>
    {
        public X x;
        public Y y;

        public Pair(X x, Y y)
        {
            this.x = x;
            this.y = y;
        }
    }


Pair — название класса
<X, Y> — дженерики или что это? Я так понимаю что вместо этих X, Y мы можем любой деженерик тип впихнуть?

можете подсказать где об этом прочитать?

Спасибо!
  • ,

Интерфейсы

В уроке 14 есть лекция «Стандартные интерфейсы: InputStream,OutputStream. Так вот, допустим я создаю свой класс и хочу чтобы он у меня имел способности чтения и записи, для чего мне нужно реализовывать поддержку этих двух интерфейсов? Какая разница, что я так реализую методы в классе и что я реализую поддержку интерфейсов, вот не доходит до меня… Интерфейс это же как способ взаимодействия с классом… хотя в данном примере это просто определение ролей для класса, выходит это вся польза интерфейса? именно в данном случае.

Подскажите пожалуйста.(интерфейсы)

Не могу понять почему не компилируется последняя строчка.
Интерфейс реализует одного работника(Employee), у которого есть менеджер.
Задача состоит в том, чтобы создать цепочку работников (Employee-->Employee.manager-->> topmanager).
Я не уверен в том, что я правильно реализовал метод getTopManager.
Компилятор говорит вот что:

Exception in thread «main» java.lang.NullPointerException
Hasan
at exp1.Check.main(forexp1.java:89)
Hasan
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Hasan
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Собственно код:
package exp1;

/**
* Created by Хасан on 06.07.2014.
*/
interface Employee{
public void setName(String name);
public String getName();
public void setManager(Employee manager);
public String getManagerName();
public Employee getTopManager();
}

class Employeeimpl implements Employee {
String name;
Employeeimpl manager;

Employeeimpl(String name){
this.name = name;
}

Employeeimpl(){
}

Employeeimpl(String name, Employeeimpl manager){
this.name = name;
this.manager = manager;
}

@Override
public void setName(String name) {
this.name = name;
}

@Override
public String getName() {
return this.name;
}

@Override
public void setManager(Employee manager) {
Employeeimpl managerimpl1 = (Employeeimpl) manager;
this.manager = managerimpl1;
}

@Override
public String getManagerName() {
return this.manager.name;
}

@Override
public Employee getTopManager() {
Employeeimpl employeeimpl = (Employeeimpl) this;
if (employeeimpl.manager == null)
return this;
else {
Employeeimpl highermanager = employeeimpl.manager.manager;
while (true) {
if (highermanager == null)
break;
else
highermanager = highermanager.manager;
}
return highermanager;
}

}
}

class Check{
public static void main(String[]args){
Employeeimpl hasan=new Employeeimpl();
Employeeimpl stive = new Employeeimpl();
Employeeimpl john = new Employeeimpl();
hasan.setManager(null);
stive.setManager(hasan);
john.setManager(stive);

hasan.setName(«Hasan»);
stive.setName(«Stive»);
john.setName(«John»);

System.out.println(hasan.getName());
System.out.println(stive.getManagerName());
System.out.println(john.manager.getManagerName());
Employee topmanager = new Employeeimpl();
topmanager = john.getTopManager();
System.out.println(topmanager.getName());

}
}
  • ,

level14.lesson08.home02

package com.javarush.test.level14.lesson08.home02;

/* Дегустация вин
1. Создать абстрактный класс Drink с реализованным методом public void taste(), который выводит в консоль "Вкусно"
2. Создать класс Wine, который наследуется от Drink, с реализованным методом public String getHolidayName(), который возвращает строку "День рождения"
3. Создать класс BubblyWine, который наследуется от Wine, с реализованным методом public String getHolidayName(), который возвращает строку "Новый год"
4. Написать реализацию методов getDeliciousDrink, getWine, getBubblyWine
5. Каждый класс и интерфейс должны быть в отдельных файлах
6. Метод main менять нельзя!
*/



public class Solution {
    public static void main(String[] args) {
        getDeliciousDrink().taste();
        System.out.println(getWine().getHolidayName());
        System.out.println(getBubblyWine().getHolidayName());
        System.out.println(getWine().getHolidayName());
    }

    public static Drink getDeliciousDrink() {
       return new Wine();}

    public static Wine getWine() {
        return new Wine();}

    public static Wine getBubblyWine() {
        return new BubblyWine();}
}


public abstract class Drink {
    public void taste(){
        System.out.println("Вкусно");
    }
}


<code public String getHolidayName(){
return «Новый год»;
}>

public String getHolidayName(){
        return "Новый год";
    }

public String getHolidayName(){
        return "Новый год";
    }