#23 Интерфейсы - приватные, статические и дефолтные методы, наследование интерфейсов | Java для ...

Поделиться
HTML-код
  • Опубликовано: 11 дек 2024

Комментарии • 23

  • @ilonaa8756
    @ilonaa8756 2 года назад +4

    жаль что не нашла у вас видео про лямбда выражения по Java, спасибо за уроки.

  • @GenriTech
    @GenriTech 3 года назад +3

    Спасибо! Очень полезно!) Это самый лучший урок по интерфейсам что я видел в сети!)
    Теперь многое стало мне понятным) Спасибо)

  • @LAZIO14
    @LAZIO14 Год назад +1

    блестящее видео, отличная работа!

  • @DRTR-bm8wt
    @DRTR-bm8wt 4 года назад +4

    Спасибо тебе большое, за твои уроки

  • @MERSIN-HOMES
    @MERSIN-HOMES Год назад +1

    Спасибо за урок!
    Посмотрел выложенные варианты решения и мне показалось, что в них задание выполнено не в полном объеме. Выкладываю свой вариант решения задачи:
    import java.util.Arrays;
    public class app {
    public static void main(String[] args) {
    DataGraph DGGG = new DataGraph (1,2,3,6); // Вносим исходные данные
    DGGG = new DataGraph (10,20,30,60); // Изменяем данные
    DGGG = new DataGraph (350,250,350,650); // Повторно изменяем данные
    }
    }
    class DataGraph { // Объявен класс DataGraph для хранения данных
    // для графика в виде массива вещественных чисел
    final int N = 4; // размерностью N элементов
    static double [] data; // массив для хранения чисел
    static Observer [] graphs = new Observer[3]; // массив для экземпляров классов LineGraph, BarGraph и ChartGraph
    public DataGraph (){ // пустой конструктор для создания экземпляра класса
    }
    public DataGraph (double x1,double x2,double x3,double x4){ // конструктор DataGraph для внесения вещ-х чисел
    data = new double[] {x1, x2, x3, x4}; // занесение вещ-х чисел в массив data
    Observer.update(graphs[0], graphs[1], graphs[2]); // вызов метода update() интерфейса Observer
    } // для перерисовки графиков через ссылки graphs
    public static double [] getData() { // публичный метод getData() возвращает ссылку на
    return data; // массив data где храняться вещ-е числа
    }
    }
    interface Observer { // интерфейс Observer с методом update()
    static void update(Observer LG,Observer BG,Observer CG) { // По методу update() происходит обновление данных и перерисовка графика.
    LG = new LineGraph(); // входными данными для метода являются ссылки graphs
    BG = new BarGraph();
    CG = new ChartGraph();
    }
    }
    class LineGraph implements Observer { // НЕ дочерний DataGraph класс (точки в графике соединяются линиями)
    public DataGraph dg = new DataGraph(); // ссылка на объект класса DataGraph
    LineGraph (){
    dg.graphs[0] = this; // экземпляр класса LineGraph сохраняется в массив graphs класса DataGraph
    // Рисование графика. Данные беруться через публичный метод getData() (класса DataGraph)
    System.out.println("Рисуем линейный график. Данные для построения: " + Arrays.toString(dg.getData()));
    }
    }
    class BarGraph implements Observer { //См. описание class LineGraph (график в виде столбцов)
    public DataGraph dg = new DataGraph();
    BarGraph (){
    dg.graphs[1] = this;
    System.out.println("Рисуем график в виде столбцов. Данные для построения: " + Arrays.toString(dg.getData()));
    }
    }
    class ChartGraph implements Observer { // См. описание class LineGraph(график в виде круговой диаграммы)
    public DataGraph dg = new DataGraph();
    ChartGraph (){
    dg.graphs[2] = this;
    System.out.println("Рисуем график в виде круговой диаграммы. Данные для построения: " + Arrays.toString(dg.getData()));
    }
    }

  • @Yornero
    @Yornero 4 года назад +1

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

  • @natalyamurashko125
    @natalyamurashko125 3 года назад +1

    Thank you very much for this amazing lesson!

  • @meganfox54
    @meganfox54 4 года назад +2

    Спасибо вам большое!

  • @Bah1918
    @Bah1918 4 года назад +2

    Добрый день. Каждый урок не только новые знания ,но и хорошее настроение .Главное доступно и понятно. СПАСИБО. Скажите практика будет?

    • @selfedu_rus
      @selfedu_rus  4 года назад

      Практика самостоятельная по подвигам в конце видео )

  • @Timur-j9t8y
    @Timur-j9t8y Год назад +2

    А в чем разница между интерфейсами и абстрактными классами?

  • @Частныйсектор-х4я
    @Частныйсектор-х4я 2 года назад +2

    Закончил вторую часть домашки, мейн:
    // DataGraph dataGraph = new DataGraph(1, 2, 3, 4); //Устаревшие методы
    // dataGraph.update(7,8,9,10); //устаревшее обновление
    DataGraph.getInstance();
    DataGraph.getUpdate(1,2,5,7);
    DataGraph.getUpdate(2,12,15,17);
    И так классы... в этот раз без обьяснений, думаю от первого урока не так много изменений, приват на все конструкторы, и метод статический на проверку и создание.
    interface Observer {
    void update(double [] inter);
    }
    class DataGraph {
    static final int N = 4;
    static double data[] = new double[N];
    static Observer[] graphs = new Observer[3];
    private static DataGraph instance;
    public static synchronized DataGraph getInstance() {
    if (instance == null) {
    instance = new DataGraph();
    }
    return instance;
    }
    public static synchronized double[] getUpdate(double first, double second, double third, double fours){
    data[0] = first;
    data[1] = second;
    data[2] = third;
    data[3] = fours;
    System.out.println("Данные внесены в базу: "+Arrays.toString(data));
    graphs[0] = new LineGraph(data);
    graphs[1] = new BarGraph(data);
    graphs[2] = new ChartGraph(data);
    return data;
    }
    private DataGraph(double first, double second, double third, double fours) {
    data[0] = first;
    data[1] = second;
    data[2] = third;
    data[3] = fours;
    System.out.println("Данные внесены в базу: "+Arrays.toString(data));
    graphs[0] = new LineGraph(data);
    graphs[1] = new BarGraph(data);
    graphs[2] = new ChartGraph(data);
    }
    private DataGraph() {
    }
    void update(double first, double second, double third, double fours) {
    System.out.println("Выполняю обновление данных");
    data[0] = first;
    data[1] = second;
    data[2] = third;
    data[3] = fours;
    graphs[0].update(getData());
    graphs[1].update(getData());
    graphs[2].update(getData());
    }
    public double[] getData() {
    return data;
    }
    }
    class LineGraph implements Observer {
    public void update(double [] inter) {
    LineGraph goUpdate = new LineGraph(inter);
    }
    public LineGraph(double [] in) {
    System.out.println("Создан объект линейного графика "+Arrays.toString(in));
    }
    }
    class BarGraph implements Observer {
    public void update(double [] inter) {
    BarGraph goUpdate = new BarGraph(inter);
    }
    public BarGraph(double [] in) {
    System.out.println("Создан объект Столбиковый график "+Arrays.toString(in));
    }
    }
    class ChartGraph implements Observer {
    public void update(double [] inter) {
    ChartGraph goUpdate = new ChartGraph(inter);
    }
    public ChartGraph(double [] in) {
    System.out.println("Создан объект Диаграмма "+Arrays.toString(in));
    System.out.println("--------------------------------------------------------------");
    }
    }

  • @hoji1944
    @hoji1944 11 дней назад +1

    Моя реализация(все классы и интерфейс в разных файлах):
    public class Main {
    public static void main(String[] args) {
    Observer[] graphs = new Observer[3];
    graphs[0] = new LineGraph();
    graphs[1] = new BarGraph();
    graphs[2]= new ChartGraph();
    graphs[0].draw();
    graphs[1].draw();
    graphs[2].draw();
    double[] da = {12, 23, 45};
    DataGraph.setData(da);
    }
    }
    public final class DataGraph {
    private static final int N = 3;
    private static int count;
    private static DataGraph dataGraph;
    private static ArrayList graphs;
    private static double[] data;
    static {
    count = 0;
    graphs = new ArrayList();
    }
    {
    data = new double[N];
    }
    private DataGraph(){
    count++;
    }
    public static DataGraph getInstance(){
    if(count < 1)
    dataGraph = new DataGraph();
    return dataGraph;
    }
    public double[] getData() {
    return data;
    }
    public static void setData(double[] newData){
    if(newData.length == N)
    data = newData;
    updateGraphs();
    }
    public static void setGraphs(Observer graph){
    if(!graphs.contains(graph))
    graphs.add(graph);
    }
    public static void updateGraphs(){
    System.out.println("Обновленные графики: ");
    for(Observer i: graphs)
    i.update();
    }
    }
    public interface Observer {
    void update();
    void draw();
    }
    public class LineGraph implements Observer{
    private static double[] data;
    private DataGraph dg;
    static {
    data = DataGraph.getInstance().getData();
    }
    {
    dg = DataGraph.getInstance();
    }
    public LineGraph(){
    DataGraph.setGraphs(this);
    }
    public void draw(){
    System.out.printf("Рисование линии: ");
    for(double i: dg.getData())
    System.out.printf("%.2f ", i);
    System.out.println();
    }
    @Override
    public void update() {
    dg = DataGraph.getInstance();
    data = dg.getData();
    draw();
    }
    }
    public class BarGraph implements Observer{
    private static double[] data;
    private DataGraph dg;
    static {
    data = DataGraph.getInstance().getData();
    }
    {
    dg = DataGraph.getInstance();
    }
    public BarGraph(){
    DataGraph.setGraphs(this);
    }
    public void draw(){
    System.out.printf("Рисование столбцов: ");
    for(double i: dg.getData())
    System.out.printf("%.2f ", i);
    System.out.println();
    }
    @Override
    public void update() {
    dg = DataGraph.getInstance();
    data = dg.getData();
    draw();
    }
    }
    public class ChartGraph implements Observer{
    private static double[] data;
    private DataGraph dg;
    static {
    data = DataGraph.getInstance().getData();
    }
    {
    dg = DataGraph.getInstance();
    }
    public ChartGraph(){
    DataGraph.setGraphs(this);
    }
    public void draw(){
    System.out.printf("Рисование круговых диаграмм: ");
    for(double i: dg.getData())
    System.out.printf("%.2f ", i);
    System.out.println();
    }
    @Override
    public void update() {
    dg = DataGraph.getInstance();
    data = dg.getData();
    draw();
    }
    }

  • @giorgi_pa
    @giorgi_pa 3 года назад

    хочу добавить один момент. могли бы вы потвердить, или опровергнуть следущее. подзказать или прокоментировать
    interface I1 {
    default void f1(){}
    }
    interface I2 {
    default void f1(){}
    }
    variant 1. OK если переопределить функцию в дочернем классе как ви и обьясняли.
    abstract class C1 implements I1{
    }
    variant 2. ERROR надо переопределять функциу f1()
    abstract class C1 implements I1,I2{
    }

    • @selfedu_rus
      @selfedu_rus  3 года назад

      Если в интерфейсах одинаковые методы по умолчанию его нужно обязательно переопределить в классе C1.

    • @georgepetrosyan4589
      @georgepetrosyan4589 3 года назад +1

      @@selfedu_rus Ааа т.е приоритет в даном случае выше у перелпределения. Спасибо буду помнить.
      Вы не подумайте ничего плохого, у меня опыт с++ более 15 лет, а джава очень близка по духу, ваши уроки очень помогают. Я по всякому стараюсь объявить класс и т.д., поэтому появляются вопросы, а вы сами знаете, что все изюминки обычно не пишут в просторах а передаются из уст в уста :)

  • @Частныйсектор-х4я
    @Частныйсектор-х4я 2 года назад +1

    Домашку осилил! 🤣
    самая тяжелая домашка до текущего времени, долго ломал голову, перебирал варианты, удивлялся и экспериментировал.
    Так как я ее делал прямо со скрипом, я напишу ниже мейн и классы и постараюсь описать, что делал и какая логика...
    мейн:
    DataGraph dataGraph = new DataGraph(1, 2, 3, 4); //создаем базу данных, задаем 4 значения для графиков
    в консоли:
    Данные внесены в базу: [1.0, 2.0, 3.0, 4.0]
    Создан объект линейного графика [1.0, 2.0, 3.0, 4.0]
    Создан объект Столбиковый график [1.0, 2.0, 3.0, 4.0]
    Создан объект Диаграмма [1.0, 2.0, 3.0, 4.0]
    --------------------------------------------------------------
    мейн: включаем метод обновления с занесением новых значений, у DataGraph = итого теперь мейн выглядит так:
    DataGraph dataGraph = new DataGraph(1, 2, 3, 4);
    dataGraph.update(7,8,9,10);
    в консоли:
    Данные внесены в базу: [1.0, 2.0, 3.0, 4.0]
    Создан объект линейного графика [1.0, 2.0, 3.0, 4.0]
    Создан объект Столбиковый график [1.0, 2.0, 3.0, 4.0]
    Создан объект Диаграмма [1.0, 2.0, 3.0, 4.0]
    --------------------------------------------------------------
    Выполняю обновление данных
    Создан объект линейного графика [7.0, 8.0, 9.0, 10.0]
    Создан объект Столбиковый график [7.0, 8.0, 9.0, 10.0]
    Создан объект Диаграмма [7.0, 8.0, 9.0, 10.0]
    --------------------------------------------------------------
    Process finished with exit code 0
    и так ниже будут классы, ибо мейн сделан для пользователя, чтобы ему удобно было (а не мне).

    • @Частныйсектор-х4я
      @Частныйсектор-х4я 2 года назад +2

      interface Observer {
      void update(double [] inter);
      }
      //выше интерфейс из задания, с методом апдейт, но принимающий на себя массив, для апдейта. Мы обязаны оверайдить во всех классах где будет внедрен интерфейс.
      class DataGraph {
      final int N = 4; //пусть у меня будет 4 размер массива а не 10 (лень)
      double data[] = new double[N]; //обьявил массив, длина = 4
      Observer[] graphs = new Observer[3]; //создаем массив графс размером на 3 обьекта
      //ниже конструктор, принимаем 4 числа дабл, они лезут в наш масив ДАТА, заодно создадим графики и дадим им данные!
      DataGraph(double first, double second, double third, double fours) {
      data[0] = first;
      data[1] = second;
      data[2] = third;
      data[3] = fours;
      System.out.println("Данные внесены в базу: "+Arrays.toString(data));
      graphs[0] = new LineGraph(data);
      graphs[1] = new BarGraph(data);
      graphs[2] = new ChartGraph(data);
      }
      //пустой конструктор нужен мне для создания простого ДатаГрафа без параметров.
      DataGraph() { }
      //метод обновления, принимает 4 числа дабл для изменения графиков, запускает Апдейт у них применяя getData()
      void update(double first, double second, double third, double fours) {
      System.out.println("Выполняю обновление данных");
      data[0] = first;
      data[1] = second;
      data[2] = third;
      data[3] = fours;
      graphs[0].update(getData());
      graphs[1].update(getData());
      graphs[2].update(getData());
      }
      //По Техзаданию, getData() дает данные, возвращая массив ДАТА тому кто спрашивает.
      public double[] getData() {
      // System.out.println("Сработала функция getData в классе DataGraph");
      return data;
      }
      }
      //первый класс линейного графика, наследуемый от интерфейса, оверайдим его метод update()
      class LineGraph implements Observer {
      DataGraph dg; // создаем обьект датаграф, так как у нас нет наследования на класс, будем идти так.
      //этот метод берет данные из getData() в классе DataGraph,
      public void update(double [] inter) {
      dg = new DataGraph(); //создали
      dg.data = inter; //массив dg = массиву из параметров = летит в DataGraph = GetData
      LineGraph goUpdate = new LineGraph(dg.data); //клепаем график, с нашим массивом
      }
      //тут у нас конструктор класса, принимае на вход массив дабл, но можно и из других мест - передавать массив сюда
      LineGraph(double [] in) {
      System.out.println("Создан объект линейного графика "+Arrays.toString(in));
      }
      }
      // остальные классы однотипны, ничего нового
      class BarGraph implements Observer {
      DataGraph dg;
      public void update(double [] inter) {
      dg = new DataGraph();
      dg.data = inter;
      BarGraph goUpdate = new BarGraph(dg.data);
      }
      public BarGraph(double [] in) {
      System.out.println("Создан объект Столбиковый график "+Arrays.toString(in));
      }
      }
      class ChartGraph implements Observer {
      DataGraph dg;
      public void update(double [] inter) {
      dg = new DataGraph();
      dg.data = inter;
      ChartGraph goUpdate = new ChartGraph(dg.data);
      }
      public ChartGraph(double [] in) {
      System.out.println("Создан объект Диаграмма "+Arrays.toString(in));
      System.out.println("--------------------------------------------------------------");
      }
      }

  • @Частныйсектор-х4я
    @Частныйсектор-х4я 2 года назад

    всеравно, уже сморю у разных учителей, пока тяжело понять зачем они))

    • @лалала-т7в
      @лалала-т7в 2 года назад

      Дабы сократить код

    • @лалала-т7в
      @лалала-т7в 2 года назад +1

      Такая же херня, сейчас сижу на ооп нужно реализовать через класс или интерфейс заполнение обьекта. Впринципе как без него это сдклать я представляю

    • @Частныйсектор-х4я
      @Частныйсектор-х4я 2 года назад

      @@лалала-т7в да код надо сокращать, но мы пока учимся писать код, и уже домашка тут очень тяжелая, предполагает уже опыт какой то...
      сижу ломаю голову над домашним заданием

  • @The4akki
    @The4akki 3 года назад

    Что-то получилось, только не уверен, что правильно
    Вот, СПОЙЛЕР
    Первый файл >>
    package interfaces.test.test3;
    public class DataGraph {
    double[] data;
    Observer[] graphs = new Observer[]{new BarGraph(), new ChartGraph(), new LineGraph()};
    double[] getData() {
    return data;
    }
    }
    interface Observer {
    void update(double[] in);
    void startLink(DataGraph dataGraph);
    }
    class LineGraph implements Observer {
    DataGraph dataGraph;
    @Override
    public void update(double[] in) {
    dataGraph.data = in;
    System.out.println("Рисуем точки в графике соединяются линиями");
    }
    @Override
    public void startLink(DataGraph dataGraph) {
    this.dataGraph = dataGraph;
    }
    }
    class BarGraph implements Observer {
    DataGraph dataGraph;
    @Override
    public void update(double[] in) {
    dataGraph.data = in;
    System.out.println("Рисуем график в виде столбцов");
    }
    @Override
    public void startLink(DataGraph dataGraph) {
    this.dataGraph = dataGraph;
    }
    }
    class ChartGraph implements Observer {
    DataGraph dataGraph;
    @Override
    public void update(double[] in) {
    dataGraph.data = in;
    System.out.println("Рисуем график в виде круговой диаграммы");
    }
    @Override
    public void startLink(DataGraph dataGraph) {
    this.dataGraph = dataGraph;
    }
    }
    Второй файл >>
    package interfaces.test.test3;
    import java.util.Arrays;
    public class test3Start {
    public static void main(String[] args) {
    DataGraph dataGraph = new DataGraph();
    dataGraph.graphs[0].startLink(dataGraph);
    dataGraph.graphs[1].startLink(dataGraph);
    dataGraph.graphs[2].startLink(dataGraph);
    dataGraph.graphs[0].update(new double[]{1,3,4});
    System.out.println(Arrays.toString(dataGraph.getData()));
    dataGraph.graphs[0].update(new double[]{1,3,23});
    System.out.println(Arrays.toString(dataGraph.getData()));
    }
    }