1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 67

Объясните почему код выполняется именно так (private)

29.12.2018, 12:01. Показов 3465. Ответов 28
Метки oop (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день коллеги! Всех с наступающим! Есть вот такой кусок кода :
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Solution {
    private String name;
 
    Solution(String name) {
        this.name = name;
    }
 
    private String getName() {
        return name;
    }
 
    private void sout() {
        new Solution("The Darkside Hacker") {
            void printName() {
                System.out.println(getName());
            }
        }.printName();
    }
 
    public static void main(String[] args) {
        new Solution("Риша").sout();
    }
}
Так вот, задача учебная и чет никак не пойму алгоритм работы, суть: есть у метода getName() стоит модификатор доступа private выводится Риша, если изменить на public или убрать, то The Darkside Hacker.
При создании экземпляра класса Soluton() далее описывается новый метод класса? и поведение getName() тоже пока не понятно. Буду благодарен тому кто разъяснит.
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2018, 12:01
Ответы с готовыми решениями:

Объясните почему работает именно так?
Добрый день. Пишу приложение и пытаюсь в меню добавить обработку метода jMenuItem1MouseClicked (при выборе пункта меню окно должно...

Магия Java или объясните, почему так
Здравствуйте, в процессе разработки, подбирая различный способы обработки данных с приведением типов, наткнулся на одну занимательную...

Элементарная задача с Циклом. Почему код выполняется именно 8 раз?
Добрый день, сижу целый день и не могу понять почему именно так, можно расписать по полочкам пожалуйста? Почему выполняется именно 8 раз ...

28
 Аватар для vvm28
772 / 540 / 67
Регистрация: 22.12.2013
Сообщений: 2,499
Записей в блоге: 26
29.12.2018, 18:45
Студворк — интернет-сервис помощи студентам
NiceJacket, Да тут я ошибся. Действительно. Нет определения класса в методе.

Добавлено через 1 час 39 минут
Уточнение к моему коду:
Java
1
2
3
4
5
6
7
8
9
private void sout() {
        new Solution("The Darkside Hacker") /*анонимный класс с методом printName()*/ {
            void printName() {
                /*тут мы обращаемся из локального метода */
                System.out.println("getName = " + getName());
                System.out.println("super.getName  = " + super.getName());
// то есть данное наследование существует только здесь.
            }
        }.printName();
При выходе из метода, объекта класса new Solution("The Darkside Hacker"), такого объекта класса по идее уже нет.
0
 Аватар для Aviz__
2761 / 2068 / 509
Регистрация: 17.02.2014
Сообщений: 9,499
29.12.2018, 19:05
Цитата Сообщение от NiceJacket Посмотреть сообщение
от которого наследуется вновь созданный
мдя, как-то этот момент я не понял(.
0
 Аватар для vvm28
772 / 540 / 67
Регистрация: 22.12.2013
Сообщений: 2,499
Записей в блоге: 26
29.12.2018, 19:08
И более простое объяснение. Наследуются только public поля, private не наследуются.
Точнее наследуется, всё. Но мы обычным способом, можем получить доступ только к public полям суперкласса.
1
29.12.2018, 19:14

Не по теме:

NiceJacket, Молодец.
Название: 151513623615269132.jpg
Просмотров: 33

Размер: 15.7 Кб

0
29.12.2018, 19:17

Не по теме:

О какая у нас полемика тут развелась ) Aviz__, присоединялся бы ))

0
 Аватар для Aviz__
2761 / 2068 / 509
Регистрация: 17.02.2014
Сообщений: 9,499
29.12.2018, 19:26
Цитата Сообщение от NiceJacket Посмотреть сообщение
Aviz__, присоединялся бы
не последняя, Бро, полемика)). Истина многогранна!
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.12.2018, 20:17
Цитата Сообщение от vvm28 Посмотреть сообщение
Наследуются только public поля, private не наследуются.
Ну это-то понятно всем))
Я думаю была заковыка в том что наш суперкласс == внешнему классу. (введеный вами super.getName() меня запутал).
Методом super.getName() , наш анонимный класс через родителя видит приватные поля и методы Solution, и его Solution будет тот что "The Darkside Hacker" а не "Риша".
Ведь если подумать почему наш аннонимный класс который наследуется от Solution (и не видит его приватные поля и методы) в своем описании System.out.println("getName = " + getName()); имеет доступ getName() к тому чего не видит?

Добавлено через 11 минут
Цитата Сообщение от Alexandr056 Посмотреть сообщение
При создании экземпляра класса Soluton() далее описывается новый метод класса?
Нет, описывается новый класс. Он тоже Soluton() но более конкретный - это его наследник (или тот кто имплементирует, в случае интерфейсов).
Цитата Сообщение от Alexandr056 Посмотреть сообщение
и поведение getName() тоже пока не понятно. Буду благодарен тому кто разъяснит.
Вот мне тоже хотелось бы более развернутого разяснения (в случае с приватными полями). Предположения есть, но почитать не нашел где.
Суть предположений : System.out.println("это равно " + (Soluton.this.getName() == getName())); // это равно true
А вот почему хотелось бы более подробно.

Добавлено через 12 минут
Хочу сам себя выправить. Вот так я не считаю :

Не по теме:

super.getName() это обращение к getName() Риши не как к суперклассу (инече б не было видно) а как к тому на кого имеется ссылка($) нашего анонимного класса.

super.getName() это обращение нашего расширения к Solution("The Darkside Hacker"), вот он и видит приватные поля, и поле getName() для него будет "The Darkside Hacker".
0
 Аватар для vvm28
772 / 540 / 67
Регистрация: 22.12.2013
Сообщений: 2,499
Записей в блоге: 26
29.12.2018, 21:16
ViktorFX, Если написать
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
 private void sout() {
        new Solution("The Darkside Hacker") /*анонимный класс с методом printName()*/ {
            void printName() {
                /*тут мы обращаемся из локального метода */
                System.out.println("getName = " + getName());
                System.out.println("super.getName  = " + super.getName());
                
                System.out.println("это равно " + (super.getName() == Solution.this.getName()));
                System.out.println("это эквивалентно " + (Solution.this.getName().equals(super.getName())));
                                
            }
        }.printName();
    }
То получим false, false;

Добавлено через 14 минут
Мы можем вставить блок инициализации и добавить свою переменную name в анонимный класс:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void sout() {
        new Solution("The Darkside Hacker") /*анонимный класс с методом printName()*/ {
            
            private String name;
            // блок инициализации
            {
            this.name = "Новое имя анонимного класса";
            }
            String getName() {
                return this.name;
            }
            void printName() {
                /*тут мы обращаемся из локального метода */
                System.out.println("getName = " + getName());
                System.out.println("super.getName  = " + super.getName());
                
                System.out.println("это равно " + (super.getName() == Solution.this.getName()));
                System.out.println("это эквивалентно " + (Solution.this.getName().equals(super.getName())));
                                
            }
        }.printName();
    }
1
 Аватар для vvm28
772 / 540 / 67
Регистрация: 22.12.2013
Сообщений: 2,499
Записей в блоге: 26
27.06.2019, 22:37
PS. Здесь мне нужно сделать уточнение.
Я написал
Java
1
 this.name = "Новое имя анонимного класса";
Это не совсем точно. У анонимного класса есть имя "скрытое от посторонних глаз".
Здесь я просто задаю переменную типа String - это не реальное имя экземляра класса, а только некоторая заданная мной переменная.
Так я не задаю "реальное" имя экземпляру класса, а как-то обозначаю экземпляр класса.
То есть, как вы понимаете я задал переменную, чтобы просто как-то обозначить этот экземпляр класса.
Но в таком виде у меня будут одинаковые имена для всех экземпляров этого класса.
Чтобы немного доработать код можно дописать метод setName, чтобы задавать переменную
Java
1
private String name;
Но это по сути ненужное извращение, поскольку сам смысл анонимного класса
теряется. А смысл его использования это сокрытие данных внутреннего анонимного класса от внешнего воздействия, с целью предотвращения повреждения данных извне.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.06.2019, 22:37
Помогаю со студенческими работами здесь

Почему именно так ?!
Используйте функции fft и ifft в Mathcad, если выполнены следующие два условия: аргументы вещественны, и вектор данных имеет 2^m...

Почему именно так правильно?
Все данные текстовые. Первый вопрос. Вариант 1 while (temporari==0) // ищем номер столбца с нужным кодом, если доходим до 0 в...

Groovy Почему ObjectMapper работает именно так
У меня есть класс типа JsonResponse в котором есть поле result типа Object. Этому полю присваиваются разнообразные значения, в зависимости...

ОВЕН и др. Почему именно так измеряют???
Разобрал на работе несколько разных термодатов в частности ОВЕН, ВАРТА и еще какой то. И у все измерение температуру идет следующим...

Почему функция работает именно так?
Доброго времени суток! Помогите разобраться с кодом пожалуйста У меня есть фигурка которая крутится на экране. Есть функция которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

Новые блоги и статьи
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru