• ,

com.javarush.task.task18.task1813

package com.javarush.task.task18.task1813;

import java.io.*;

/* 
AmigoOutputStream
*/

public class AmigoOutputStream extends FileOutputStream {
    public static String fileName = "D:/tmp/result.txt";
    private FileOutputStream original = null;


    public AmigoOutputStream(FileOutputStream fileOutputStream) throws Exception {
        super(fileOutputStream.getFD());
        this.original = fileOutputStream;
    }

    @Override
    public void write(int b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        original.write(b, off, len);
    }

    @Override
    public void close() throws IOException {
        original.flush();
        original.write("JavaRush © All rights reserved.".getBytes());
        original.close();
    }

    @Override
    public void flush() throws IOException {
        original.flush();
    }

    public static void main(String[] args) throws Exception {
        new AmigoOutputStream(new FileOutputStream(fileName));
    }

}

Вот такое решение получилось. После того как валидатор принял его, решил протестировать.
переписал метод main следующим образом:
AmigoOutputStream amigoOutputStream = new AmigoOutputStream(new FileOutputStream(fileName));
        amigoOutputStream.close();

Открываю выходной файл и вижу там:
JavaRush © All rights reserved.JavaRush © All rights reserved.

Строка записалась два (!) раза. Отладка показала что переопределенный метод close выполняется два раза…

До верного решения додумался сам заменив строку :
super(fileOutputStream.getFD());
на :
super(filename);
но у меня остались вопросы:
Что это за FileDescriptor, который возвращает метод getFD()?
Получается с его помощью нельзя инициализировать FileOutputStream?
И почему при таком вызове конструктора суперкласса метод close выполняется два раза?

level13.lesson04.task03

Привет всем! Такая задача:

1. Унаследовать Fox от интерфейса Animal.
2. Поменяй код так, чтобы в классе Fox был только один метод — getName.
3. Создавать дополнительные классы и удалять методы нельзя!

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

    public interface Animal
    {
        Color getColor();
    }

    public static class Fox
    {
        public String getName()
        {
            return "Fox";
        }
    }
}


Итак, вопрос: как наследовать класс от интерфейса, но запретить реализацию методов интерфейса наследуемому его классу?
  • ,

Наследование как явление

Сказать по правде, изначально я этой статьи не планировал. Я считал вопросы, которые хочу тут обсудить, тривиальными, не стоящими даже упоминания. Однако в процессе написания статей для этого сайта я поднял в одном из форумов обсуждение множественного наследования. В результате чего выяснилось, что большая часть разработчиков имеет весьма смутное представление о наследовании. И, соответственно, допускает очень много ошибок. Поскольку наследование является одной из важнейших черт ООП (если не самой важной!) – я решил посвятить этому явлению отдельную статью.

* * *

Сначала я хочу разграничить два понятия – объект и класс. Эти понятия постоянно путают. Между тем, они являются центральными в ООП. И знать различия между ними, на мой взгляд, необходимо.

Итак, объект. По сути, это что угодно. Вот кубик лежит. Деревянный, синий. Длина ребра 5 см. Это объект. А вон пирамидка. Пластмассовая, красная. 10 см ребро. Это тоже объект. Что между ними общего? Разные размеры. Разная форма. Разный материал.

Однако, общее у них есть. Прежде всего, и кубик, и пирамидка – правильные многогранники. Т.е. сумма количества вершин и количества граней на 2 больше количества ребер. Далее. У обоих фигур есть грани, ребра и вершины. У обоих фигур есть такая характеристика, как размер ребра. Обе фигуры можно вращать. Обе фигуры можно рисовать. Два последних свойства – это уже поведение. Ну и так далее.

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

Итак, определение.

Класс – это описатель общих свойств группы объектов. Этими свойствами могут быть как характеристики объектов (размер, вес, цвет и т.п.), так и поведения, роли и т.п.

Замечание. Слово «всех» (описатель всех свойств) произнесено не было. Что означает, что любой объект может принадлежать к нескольким разным классам.



Возьмем за основу тот же пример с геометрическими фигурами. Самое общее описание – правильный многогранник. Безотносительно размера ребра, количества граней и вершин. Единственное, что мы знаем – что у этой фигуры есть вершины, ребра и грани, и что длины ребер равны.

Концепции объектно-ориентированного программирования JAVA

Перевод статьи JAVA Object Oriented Concepts

JAVA основывается на концепциях объектно-ориентированного программирования, что позволяет перейти на более высокий уровень абстракции, чтобы разрешить любую проблему реалистичным путем.
Объектно-ориентированный подход концептуализирует решение проблемы в плоскости объектов реального мира, которые легче повторно использовать в приложении. Например, Chair (стул), Fan (вентилятор), Dog (Собака), Computer (компьютер) и так далее.
В JAVA класс представляет собой макет, шаблон или прототип, который определяет общее поведение объекта данного типа. Экземпляр — это отдельная реализация класса, и все экзепляры класса имеют одинаковые свойства, которые описаны в определении класса. Например, вы можете опрделить класс с именем House (дом) с количеством комнат в качестве атрибута и создать экземпляры класса, такие как дом с двумя комнатами, дом с тремя комнатами и так далее.
Преимущества:
Ниже перечислены некоторые плюсы объектно-ориентированной разработки программного обеспечения (ПО).
  • Снижение затрат на поддержку ПО, в основном за счет того, что она осуществляется модульно.
  • Усовершенствованное повторное использование кода благодаря таким качествам, как наследование, и, как результат, более быстрая разработка ПО.
  • Повышенные надежность и гибкость кода.
  • Легкость понимания вследствие моделирования реального мира.
  • Лучшая абстракция на уровне объекта.
  • Уменьшение сложности перехода от одной фазы разработки к другой.

Есть четыре основные характеристики ООП:
  • Инкапсуляция
  • Наследование
  • Полиморфизм
  • Абстракция
  • ,

package com.javarush.test.level12.lesson12.home03;

/* Добавь один метод в класс Cat
Добавь один метод в класс Cat так, чтобы программа ничего не выводила на экран.
*/

public class Solution
{
public static void main(String[] args)
{
Pet pet = new Cat();
pet.setName(«Я — пушистик»);

System.out.println(pet.getName());
}

public static class Pet
{
protected String name;

public Pet()
{
}

public final String getName()
{
return name;
}

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

}

public static class Cat extends Pet
{

}
}
Почему если в класе кет только переопредилить метод сет на "" то ничего не будит виводиться на экран, но если в етом класе перед этом создать переменную protected String name;, которая уже есть в класе пет, то выводиться null?
  • ,

Вопрос про наследование

Допустим у нас нужно создать домашних животных (кот, собака, корова, свинья). У меня возник вопрос как будет лучше и правильней? (сейчас на 11 лекции)
1) Создать класс Pets и в нем задать конструктор с параметрами Pets(String тип животного,String имя, и т.д.) и проверять если допустим тип Собака, то будут вызываться определенные ф-ции, которые подходят только к собаке.
2) Создать класс Pets, и создавать классы кот, собака, корова, свинья и наследовать их от Pets. Но тут вопрос, так как я только учусь) Допустим в Pets есть метод setvoice, который загружает звук, могу ли я в разных классах его вызывать и в параметр передавать определенные звуки или как по другому можно животному присвоить свой звук ?) Обьясните кому не сложно) У нас получается что классы Cat и другие как бы являются экземплярами класса Pets и имеют возможность добавлять свои методы?

Лучшие Муверы

Господа, совсем недавно мы запустили интересное направление под названием Муверы. Его смысл заключает в том, что один из учеников выбирает из предоставленного списка интересную тему, детально ее изучает и снимает по ней коротки видео доклад. Формат такого доклада – свободный. Кто-то просто записывает свой экран, показывает подготовленную презентацию и комментирует ее, кто-то что-то демонстрирует в среде разработки и т.д.

За короткий промежуток времени нам прислали немалое количество Муверов (за что стоит отдельно в комментариях поблагодарить наших активных студентов), вот лучшие из них:

Что такое инкапсуляция? — vk.cc/2wNKOW
Горячие клавиши в Intellij IDEA — vk.cc/2wNLgN
Основы HTML — vk.cc/2wNOpb
Исключения (Exceptions) Часть 1 — vk.cc/2utac5
Исключения (Exceptions) Часть 2 — vk.cc/2wNM6r
Наследование — vk.cc/2wNMt4
Интерфейсы — vk.cc/2wNMY0
Что такое MVC? — vk.cc/2wNNZa
Оператор for-each — vk.cc/2wNOSO
Типы переменных и классы объектов vk.cc/2wNVEe

Смотрите, комментируйте, подписывайтесь на канал и не забывайте снимать и присылать новые Муверы. (все ролики присылайте Бендеру — vk.com/javarush_bender).

Такой формат дополнительной подготовки и обмена информацией чрезвычайно полезен, поэтому отбросьте все сомнения и действуйте!

Список заявленных тем можете найти здесь – vk.cc/2rwrOc

Если вы хотите выбрать свою тему связанную с Java – здорово, все будут только рады.
  • ,

Проблемы наследования

в одной из задач понял, что не полностью понимаю принципов наследования

package ua.org.gostroy.test;

import java.io.IOException;

    class A {
        String name = "A";

        public A(String name) {
            this.name += name;
        }

        @Override
        public String toString() {
            return name;
        }
    }

    class B extends A {
        String name = "B";

        public B(String name) {
            super(name);
            this.name += name;
        }

//        @Override
//        public String toString() {
//            return name;
//        }
    }

    public class Example {

        public static void main(String[] args) throws IOException {
            B b1 = new B("_test");
            System.out.println(b1);
        }
    }


A_test


хотя я ожидал увидеть

B_test


согласно насследованию считал что у класса B, есть неявный метод toString() с реализацией из ближайшего родителя(то есть, A). но почему тогда был вызван toString() из A, обьект же типа B?

Множественное наследование в Java . Сравнение композиции и наследования.

Некоторое время назад я написал несколько постов о наследовании, интерфейсах и композиции в Java. В этой статье мы рассмотрим множественное наследование, а затем узнаем о преимуществах композиции перед наследованием.

Множественное наследование в Java
Множественное наследование – способность создавать классы с множеством классов — родителей. В отличии от других популярных объектно-ориентированных языков, вроде С++, язык Java — не поддерживает множественное наследование классов. Не поддерживает он его из-за вероятности столкнуться с «проблемой алмаза» и вместо этого предпочитает обеспечивать некий комплексный подход для его решения, используя лучшие варианты из тех, которыми мы можем достичь аналогичный результат наследования.