#17 Внутренние и вложенные классы | Java для начинающих

Поделиться
HTML-код
  • Опубликовано: 21 сен 2024
  • Что такое внутренние и вложенные классы. Способы их определения, создания и вызовов. Публичные, закрытые и статические вложенные классы. Пример статического вложенного класса.
    Инфо-сайт: proproprogs.ru

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

  • @maxim1893g
    @maxim1893g Год назад +4

    Спасибо! Очень доступно! Ваша ручка просто безподобная!

  • @IFlexxx
    @IFlexxx Год назад +5

    Нужно было создать больше методов с одинаковым названием run(), разнести их по разным местам с разными модификаторами доступа.
    Можно еще рефлексию добавить и lombok.
    Потому, что начинающие должны страдать при попытке разобраться - что от чего зависит, и что откуда вызывается.

    • @АсяХаликова-в7б
      @АсяХаликова-в7б 9 месяцев назад

      Категорически не согласна. Показано, как ОБЫЧНО выглядит код, но подробно объясняют, что есть что. Что назвать можно одинаково, но понимание процесса дает ответ, метод какого класса вызываем; куда переходит программа, что там встречает и запускает. Спасибо большое! У меня пока получается совершить все подвиги.

  • @Denis2216s
    @Denis2216s Год назад

    Большое спасибо за крутые уроки. Очень помогает разобраться в Джаве!

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

    Автор молодец. Только я никогда не понимал зачем нужны вложенные классы и сейчас не понимаю... "Простое лучше сложного".

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

      Тебе нужен конкретный объект конкретного класса, но его область видимости не должна распространяться на весь проект, этот объект имеет смысл только в контексте какого-то другого объект ноги "внутри" собаки. Вне собаки объект ноги не нужен, поэтому класс делается внутренним чтобы работать с ним как с классом применять принципы ООП, но "запечатанным" внутри контекста другого класса. Это сделано для удобства. Если ты вынесешь класс ноги собаки в отдельный файл и потом в классе собаки просто сделаешь поле ноги собаки, и будешь так же работать то Абсолютно ничего не испортишь. Но! Когда у тебя в проекте будет 100-150 классов хочется такая чрезмерная декомпозиция на классы начинает раздражать и мешать.

  • @Benderok451
    @Benderok451 Год назад +2

    Это уже посложнее. Надо еще раз пересмотреть.

  • @sergejchap62
    @sergejchap62 Год назад +2

    Спасибо. Было б интересно где-то представить решение задания, которое в завершении этого урока. И конечно о нем мнение.

  • @Алекс-ю8э2с
    @Алекс-ю8э2с 2 года назад +3

    Какое чёткое изложение, спасибо!)

  • @svk9179
    @svk9179 7 месяцев назад +1

    Мой пример реализации второго подвига
    import java.util.HashMap;
    import java.util.Map;
    class MusicalInstrument {
    private String title;
    private int type;
    private Dimensions dimensions;
    private double price;
    private int yearProduction;
    private MusicalInstrument(){}
    MusicalInstrument(String title,int type, int yearProduction, double price, double width, double height, double depth){
    this.title = title;
    this.type = type;
    this.yearProduction = yearProduction;
    this.price = price;
    this.dimensions = new Dimensions(width,height,depth);
    Static.setMap(type);
    }
    MusicalInstrument(String title, int type, int yearProduction, double price){
    this.title = title;
    this.type = type;
    this.yearProduction = yearProduction;
    this.price = price;
    Static.setMap(type);
    }
    public void setTitle(String title) {
    this.title = title;
    }
    public void setYearProduction(int yearProduction) {
    this.yearProduction = yearProduction;
    }
    public void setType(int type) {
    this.type = type;
    Static.setMap(type);
    }
    public void setDimensions(double width, double height, double depth) {
    this.dimensions = new Dimensions(width,height,depth);
    }
    public void setPrice(double price) {
    this.price = price;
    }
    public int getType() {
    return type;
    }
    public String getTitle() {
    return title;
    }
    public Dimensions getDimensions() {
    return dimensions;
    }
    public double getPrice() {
    return price;
    }
    public int getYearProduction() {
    return yearProduction;
    }
    class Dimensions{
    private double width, height, depth;
    private Dimensions(){}
    Dimensions(double width, double height, double depth){
    this.width = width;
    this.height = height;
    this.depth = depth;
    }
    public double getWidth() {
    return width;
    }
    public double getHeight() {
    return height;
    }
    public double getDepth() {
    return depth;
    }
    public void setWidth(double width) {
    this.width = checkingParametrDimensions(width);
    }
    public void setHeight(double height) {
    this.height = checkingParametrDimensions(height);
    }
    public void setDepth(double depth) {
    this.depth = checkingParametrDimensions(depth);
    }
    private double checkingParametrDimensions(double number){
    return number < 0? 0: number;
    }
    }
    static class Static{
    static Map map = new HashMap();
    private static int num;
    static {
    num = 0;
    }
    private Static(){}
    static void setMap(int type){
    map.put(type,++num);
    }
    }
    }
    class DemoMultiInstrument{
    public static void main(String[] args) {
    MusicalInstrument musicalInstrument = new MusicalInstrument("Guitar",1,2020,10500,1.25,20,15);
    MusicalInstrument musicalInstrument1 = new MusicalInstrument("Phono", 4, 1990,2500.36);
    System.out.println(MusicalInstrument.Static.map.get(4));
    }
    }

  • @Alex_sandr1999
    @Alex_sandr1999 2 месяца назад +1

    Лайк если тоже засмеялся с "У любой стандартной собаки должны быть ноги"

  • @ВикторЖигурда
    @ВикторЖигурда 3 года назад +3

    Подача материала хорошая!

  • @СергейПетров-б1ф
    @СергейПетров-б1ф 2 года назад +1

    хорош, спасибо

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

    А я написал в методе run класса Dog как Вы и сказали: System.out.println("foot.name");
    Но никакой ошибки не выдало. Просто вывело ещё и имя локальной собачки. Какой сложный язык, у меня даже это не получается ((((((
    Но преподает Вы классно, спасибо!!! И с Наступающим.

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

      Спасибо! Поле name должно быть приватным, тогда получить доступ из вне не получится. Это железобетонно - основы инкапсуляции ООП ))

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

    Сделай уроки по Android разработке. Они намного интереснее. Или же как создать сервер с базой данных для мобильного приложения, желательно сервак на java.

  • @ИванКоновалюк-з9л
    @ИванКоновалюк-з9л Год назад +3

    Люди!!!=) помогите плиз по первой задаче -можно ли при создании объекта сразу задать параметры вложенного класса через объект "наружнего" класса? а то я только смог через отдельное создание статического объекта вложенного класса и передачи этой ссылки в класс Properties
    public class Main {
    public static void main(String[] args) {
    *Properties.Color c=new Properties.Color(8,9,10);*
    Properties p=new Properties(1,2,c);
    System.out.println("сколько красного в цвете линии "+c.red);
    System.out.println("сколько зелёного в цвете линии "+c.green);
    System.out.println("толщина линии "+p.widthLine);
    }
    static class Properties{

    int widthLine;
    int typeLine;
    Color color;
    Properties() {}
    Properties(int widthLine, int typeLine, Color color){
    this.widthLine=widthLine; this.typeLine=typeLine; this.color=color;
    }
    public static class Color{
    int red;
    int green;
    int blue;
    Color(){}
    Color(int red, int green, int blue){
    this.red=red; this.green=green; this.blue=blue;
    }
    }
    }
    }

    • @svk9179
      @svk9179 7 месяцев назад

      Я сделал без статического класса, можно задать цвета через объектную переменную.
      class Properties {
      private double widthLine;
      private String typeLine;
      private Color colorLine;
      public double getWidthLine() {
      return widthLine;
      }
      public void setWidthLine(double widthLine) {
      this.widthLine = widthLine;
      }
      public String getTypeLine() {
      return typeLine;
      }
      public void setTypeLine(String typeLine) {
      this.typeLine = typeLine;
      }
      public Color getColorLine() {
      return colorLine;
      }
      public void setColorLine(int red, int green, int blue) {
      this.colorLine = new Color(red, green, blue);
      }
      class Color{
      private int red, green, blue;
      {
      red = green = blue = 0;
      }
      private Color(){}
      Color(int red, int green, int blue){
      this.blue = blue;
      this.green = green;
      this.red = red;
      }
      public void setRed(int red) {
      if (red > 0)
      this.red = checkingColor(red);
      }
      public void setGreen(int green) {
      if (green > 0)
      this.green = checkingColor(green);
      }
      public void setBlue(int blue) {
      this.blue = checkingColor(blue);
      }
      public int getRed() {
      return red;
      }
      public int getGreen() {
      return green;
      }
      public int getBlue() {
      return blue;
      }
      private int checkingColor(int number){
      if (number >= 0 && number < 256)
      return number;
      else return 0;
      }
      }
      }
      class DemoProperties{
      public static void main(String[] args) {
      Properties properties = new Properties();
      properties.setColorLine(157,250,147);
      System.out.println(properties.getColorLine().getBlue());
      }
      }

  • @gscdcd8302
    @gscdcd8302 2 года назад +1

    Задачи оказались не такими легкими, как мне показалось на первый взгляд. Первую осилила с горем пополам через статический класс, не знаю правда, проходит ли такое решение. Вторую также, но вот пункт про типы, я вообще без единой идеи как реализовать🥲

    • @gscdcd8302
      @gscdcd8302 2 года назад +1

      Решила. Сейчас видео пересмотрела, и думаю, ну все же так очевидно было!

  • @xzebitionfive6653
    @xzebitionfive6653 9 месяцев назад +1

    Пример реализации задачи 2
    import java.util.ArrayList;
    public class MusicInstrument {
    public static void main(String[] args) {
    Instrument i1 = new Instrument("Гитара", 1, 10000, 2005, 4, 5, 6);
    Instrument i2 = new Instrument("Скрипка", 2, 10000, 2005, 4, 5, 6);
    Instrument i3 = new Instrument("Гитара", 1, 10000, 2006, 4, 5, 6);
    Instrument.info();
    }
    }
    class Instrument {
    String name;
    int type, price, year;
    Gabarits gabarits;
    Instrument(String name, int type, int price, int year, int width, int height, int depth) {
    this.name = name;
    this.type = type;
    this.price = price;
    this.year = year;
    this.gabarits = new Gabarits(width, height, depth);
    Statistics.add_info(type);
    }
    class Gabarits {
    int width, height, depth;
    Gabarits(int width, int height, int depth) {
    this.width = width;
    this.height = height;
    this.depth = depth;
    }
    }
    static void info() {
    Statistics.info();
    }
    static class Statistics {
    public static ArrayList types = new ArrayList();
    public static ArrayList counts = new ArrayList();
    public static void add_info(int type) {
    boolean flag = true;
    int id = -1;
    for (Integer el: types) {
    id += 1;
    if (el == type) {
    flag = false;
    break;
    }
    }
    if (flag) {
    types.add(type);
    counts.add(1);
    }
    else {
    int var = counts.get(id) + 1;
    counts.remove(id);
    counts.add(id, var);
    }
    }
    static void info() {
    System.out.println(types);
    System.out.println(counts);
    }
    }
    }

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

    вторая задача решена так:
    мейн:
    MusicItems musicItems = new MusicItems(5,2000,2020);
    musicItems.setSize(100,200,300);
    musicItems.show();
    в консоле:
    Type: 5
    Price: 2000
    Years: 2020
    Dimension:100, 200, 300
    Total item: 1
    класс:
    public class MusicItems {
    private int type,price, years;
    Size size = new Size();
    public MusicItems(int type, int price, int years) {
    this.type = type;
    this.price = price;
    this.years = years;
    }
    void setSize(int a, int b, int c){
    size.setWidth(a);
    size.setDepth(b);
    size.setHight(c);
    Counter.counters++;
    }
    void show(){
    System.out.println("Type: " + type+ "
    Price: "+price+"
    Years: "+years);
    System.out.println("Dimension:"+size.width+", "+size.depth+", "+ size.hight);
    System.out.println("Total item: " + Counter.counters);
    }
    class Size{
    int width = 0;
    int hight = 0;
    int depth = 0;
    public void setWidth(int width) {
    this.width = width;
    }
    public void setHight(int hight) {
    this.hight = hight;
    }
    public void setDepth(int depth) {
    this.depth = depth;
    }
    }
    static class Counter{
    public static int counters = 0;
    }
    }

  • @AB-ku1su
    @AB-ku1su 3 года назад

    Это конструктор в простых скобочках без названия { } ?

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

    Сделайте пожалуйста урок по Django python

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

      Буду делать, только при наличии интереса к этой теме. Если просмотров будет столько же, что и по Java ООП, то руки опустятся )

    • @ВикторЖигурда
      @ВикторЖигурда 3 года назад

      @@selfedu_rus продолжай в том же духе

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

      @@selfedu_rus очень жаль, что у ваших уроков по java мало просмотров, вы лично для меня находка. У меня есть мнение, что это связано с тем, что в ваших уроках мало прикладного, т.к. в основном людям нужно видео с решением их конкретной проблемы, а не видео с фундаментальными основами, но в этом их заблуждение. Не бывает волшебной пилюли, решение любой задачи должно идти через осознание основ языка и подходов к разработке.
      Также думаю вы имели бы успех, если бы выпустили серию обучающих видео по популярным направлениям, таким как автоматизированное тестирование или создание клиент серверного приложения, т.к. если коротко то я пришел к вам на канал из интереса к автоматизированному тестированию веб приложений. Но из-за того, что большинство уроков на эту тему не раскрывают особенности языка java, то я был вынужден искать более фундаментальное знания, чтобы не быть обезьянкой, которая только и знает как вызвать метод сторонней библиотеки, а быть в состоянии создать, что то свое.
      UPD: не заметил, что у вас есть уже серия по DjanGo фреймворку для веба. Хотел бы пожелать вам не отчаиваться, а продолжать творить, пускай даже и для узкой аудитории. Уверен, что успех к вам еще прийдет. Ну и конечно, контент о программировании не имеет такого успеха как видео про выживание в лесу в домике из стрейч пленки. Поэтому возможно надо искать выход к аудитории через онлайн менторство или еще как то. Всеравно большая благодарность Вам за ваш труд!

    • @АйбекЕрмекбаев-ч2и
      @АйбекЕрмекбаев-ч2и 3 года назад +2

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

  • @clannajebyan
    @clannajebyan Год назад

    За полгода, что я пытаюсь выучить ООП и понять, хоть что-то в этом, извините, свинарнике, потому что логики очередности я тут не наблюдаю совсем, я успел выучить испанский. Наверное, не стоит пытаться дальше, претензий к коду у меня больше, чем удовольствия, более нелогичного, чем программирование я в жизни не встречал.
    11:42 и что? А d2.run(); мы спокойно вызываем, хотя это класс Foot. Кроме того, d у нас это и есть Dog. Короче, нафиг.

  • @mouserailway
    @mouserailway 2 года назад

    а зачем нам конструктор Dog, который ничего не делает?

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

      мы определяем несколько конструкторов, поэтому, если не прописать конструктор без параметров, то потом не сможем создать объект, не передавая никаких аргументов. Для этого он и определен.

    • @mouserailway
      @mouserailway 2 года назад

      @@selfedu_rus спасибо

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

    Зачем говорить экземпляр класса, можно же по простому - объект такого-то класса

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

      это синоним, я говорю и так и так