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

preview_player
Показать описание
Вы узнаете как задавать статические константы и статические методы в интерфейсах (ключевое слово static). Как определять вложенные интерфейсы в классах и делать наследование (расширение) интерфейсов. Как задавать приватные методы в интерфейсах и зачем это надо. Как делать реализацию методов по умолчанию (ключевое слово default).

Рекомендации по теме
Комментарии
Автор

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

ilonaa
Автор

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

GenriTech
Автор

Thank you very much for this amazing lesson!

natalyamurashko
Автор

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

Yornero
Автор

Спасибо за урок!
Посмотрел выложенные варианты решения и мне показалось, что в них задание выполнено не в полном объеме. Выкладываю свой вариант решения задачи:

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("Рисуем линейный график. Данные для построения: " +
}
}
class BarGraph implements Observer { //См. описание class LineGraph (график в виде столбцов)
public DataGraph dg = new DataGraph();
BarGraph (){
dg.graphs[1] = this;
System.out.println("Рисуем график в виде столбцов. Данные для построения: " +
}
}

class ChartGraph implements Observer { // См. описание class LineGraph(график в виде круговой диаграммы)
public DataGraph dg = new DataGraph();
ChartGraph (){
dg.graphs[2] = this;
System.out.println("Рисуем график в виде круговой диаграммы. Данные для построения: " +
}
}

MERSIN-HOMES
Автор

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

Bah
Автор

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

qvfsnyy
Автор

хочу добавить один момент. могли бы вы потвердить, или опровергнуть следущее. подзказать или прокоментировать

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{
}

giorgi_pa
Автор

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

gcnxtmu
Автор

Домашку осилил! 🤣
самая тяжелая домашка до текущего времени, долго ломал голову, перебирал варианты, удивлялся и экспериментировал.
Так как я ее делал прямо со скрипом, я напишу ниже мейн и классы и постараюсь описать, что делал и какая логика...

мейн:

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

и так ниже будут классы, ибо мейн сделан для пользователя, чтобы ему удобно было (а не мне).

gcnxtmu
Автор

Закончил вторую часть домашки, мейн:
// 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));

}
}

gcnxtmu
Автор

Что-то получилось, только не уверен, что правильно
Вот, СПОЙЛЕР
Первый файл >>
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();



double[]{1, 3, 4});

double[]{1, 3, 23});

}
}

Theakki