Комментарии (95)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
nescafe
Уровень 30
19 апреля, 14:53
Лучший комментарий был найден к этим задачкам: "Есть иерархия классов. На вершине всегда Object. В этой программе: Object | Pet | Cat | Tiger Если перенести на людей: Животное | Млекопитающее | Человек разумный | Петрович с соседнего падика По условиям задачи, нам нужно создать такое Животное которое бы: было Животным было Млекопитающим было Человеком было Петровичем. Ты пишешь Животное животное = new Животное() но значит туда попадет все живое - рыбы, черепахи, волки, слоны и тд. А нам нужно Животное животное = new ПетровичСПадика(); Ведь Петрович это и Петрович, и Человек, и Млекопитающее и когда напьется 100% Животное. А теперь перенеси это на свой код с учетом тигров и кошек :"
nescafe
Уровень 30
19 апреля, 14:47
Оператор instanceof имеет вид: a instanceof B. Другими словами, оператор instanceof вернет значение true, если: 1) переменная а хранит ссылку на объект типа B 2) переменная a хранит ссылку на объект, класс которого унаследован от B 3) переменная а хранит ссылку на объект реализующий интерфейс B Иначе оператор instanceof вернет значение false.
nescafe
Уровень 30
13 апреля, 14:37
Как писал пользователь rotarru: "Из непонятой теории. Главы 8-9 Философия джава. Когда реализуешь метод интерфейса в классе, можно переписать тип возвращаемого методом объекта. Тип может быть не только типом интерфейса, но и типом класса, который реализует данный интерфейс."
class Solution {
    public static void main(String[] args) throws Exception {
        System.out.println(Matrix.NEO);
    }

    static class Matrix {
        public static DBObject NEO = new User().initializeIdAndName(1, "Neo");
    }

    interface DBObject {
        DBObject initializeIdAndName(long id, String name);
    }

    static class User implements  DBObject{
        public User initializeIdAndName(long id, String name) { // tip USER, a ne DBObject
            this.name = name;
            this.id = id;
            return this;
        }
        long id;
        String name;

        @Override
        public String toString() {
            return String.format("The user's name is %s, id = %d", name, id);
        }
    }
}
nescafe
Уровень 30
13 апреля, 14:30
Slowly
class Solution {
    public static void main(String[] args) throws IOException {
        // напишите тут ваш код
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        try {
            String fileName = r.readLine();
            InputStream fis = new FileInputStream(fileName);
            while (fis.available()>0) {
                int data = fis.read();
                System.out.print((char) data);
            }
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            r.close();
        }
    }
}
FASTER
class Solution {
    public static void main(String[] args) throws IOException {
        // напишите тут ваш код
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        try {
            String fileName = r.readLine();
            InputStream fis = new FileInputStream(fileName);
            r = new BufferedReader(new InputStreamReader(fis));
            while (r.ready()) {
                String text = r.readLine();
                System.out.println(text);
            }
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            r.close();
        }
    }
}
nescafe
Уровень 30
13 апреля, 13:48
//медленно InputStream is = new FileInputStream(file); int val; while ((val = is.read()) != -1) { } //быстро InputStream is = new BufferedInputStream(new FileInputStream(file)); int val; while ((val = is.read()) != -1) { } Казалось бы — очевидная истина, неправда ли? Но как показал чужой код и опыт собеседования кандидатов, часть разработчиков определенно не понимает в чем преимущество буферизованных стримов. Кто до сих пор не разобрался — метод read() класса FileInputStream: public native int read() throws IOException; Согласитесь, каждый раз делать системный вызов, чтобы считать один байт несколько расточительно. Собственно для того, чтобы избежать этой проблемы и были созданы оболочки-буферы. Все что они делают — при первом вызове системного read() считывают несколько больше (в зависимости от указанного размера буфера, котрый по умолчанию равен 8 кб) и при следующем вызове read() считывают данные уже из буфера. source: https://habrahabr.ru/post/132374/
nescafe
Уровень 30
13 апреля, 10:30
Различия между абстрактным классом и интерфейсом

1 Ключевое слово создания
    abstract                        interface

2 Ключевое слово реализации
    extends                         implements

3 Могут быть вложенными
                         да могут

4 Поля
    без ограничений                 public static final (все)

5 Блоки инициализации
    без ограничений                 запрещен

6 Конструктор
    без ограничений                 запрещен

7 Модификаторы доступа полей и методов
    public                          public (по умолчанию)
    protected
    (видимость по умолчанию
     в пределах пакета)
    private                         private [для методов, после Java 9]

8 Реализация методов при создании
    обязательна для всех,           обязательна для default, static (default не может быть static)
    кроме abstract                  [до Java 8 реализация методов запрещена - только объявление]

9 Наследование
    может расширить (extends)       может расширить (extends)
    любой один класс                до 65535 интерфейсов
    и реализовать (implements)
    до 65535 интерфейсов

10 Создание объекта
                         нельзя создать
nescafe
Уровень 30
9 апреля, 17:06
3. Да, в джаве, в отличии от классов, интерфейсы поддерживают множественное наследование, используем ключевое слово extends.
nescafe
Уровень 30
9 апреля, 16:51
Мы МОЖЕМ "менять" в перезаписанных методах тип DBObject на User потому что User - это DBObject (User is a DBObject). Помните примеры где создавался класс Animal, а потом класс Cow extends Animal ? Мы потом еще могли создавать корову так: Cow cow = new Cow(); А могли переменной суперкласса: Animal animal = new Cow(); Мы так можем делать потому что между Animal и Cow "is-a" связь. "Сow is an Animal" (Корова это Животное), НО ЖИВОТНОЕ НЕ ВСЕГДА КОРОВА! (Animal is NOT a Cow) т.к. Животное может быть свиньей, петухом, медведем, зайцем, педофилом, политиком, белкой и т.д. Когда в программе видите код типо: public class Cow extends Animal - заменяйте в уме слово "extends" на "is a" и читайте Сow is an Animal. С интерфейсами такая же штука т.к. implements это по сути тот же extends: class User implements DBObject Как читаем? User is a DBObject
nescafe
Уровень 30
7 апреля, 16:08
Самый популярный вопрос 12 уровня: так зачем эти интерфейсы нужны? Нигде ещё так часто в комментах не спрашивали зачем всё это : ) Нашёл в дебрях задач ещё одно неплохое, ёмкое объяснения от Василия: «При написании очень большого кода интерфейс гарантирует полную реализацию. Интерфейс содержит методы обязательные для реализации в классе-наследнике.. Например - чайник. Создали обычный чайник, а потом нужно создать электрический чайник. Допустим, в программе уже есть миллионы разных чайников, и они все так или иначе греют воду и т.д. Но маркетологи сказали, что нужно больше чайников богу чйников. Без наследования интерфейса, мы создали наш электрочайник и запустили в производство. Клиент его купил, а оказалось, воду-то он греет, но её нельзя оттуда вылить. Мы забыли реализовать метод, который выливает воду из чайника (ну из-за того, что там нам и так пришлось писать сотню-другую методов, ну забыли, с кем не бывает). Всё, что должен уметь чайник, было описано в интерфейсе. А если нужно было что-то ещё, например, подсветка, то мы бы описывали подсветку уже в классе, т.к это уже дополнительные свойства, не обязательные для всех чайников. Ну так вот: если бы мы использовали интерфейс, компилятор ещё бы на стадии проектирования сказал нам, что чайник не умеет выливать воду. Но мы не использовали интерфейс и получили то, что получили. Зато с подсветкой! Как-то так.» Всё получится!
nescafe
Уровень 30
25 марта, 16:50
оператор instanceof https://javarush.com/groups/posts/2018-kak-rabotaet-operator-instanceof
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}

Cat cat = new MaineCoon(); // * Объект-потомок всегда можно присвоить в переменную-предка. Пока просто запомни это, а в следующих лекциях мы еще разберем этот процесс.
System.out.println(cat instanceof Cat); //true
System.out.println(cat instanceof MaineCoon); //true