Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 67

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

29.12.2018, 12:01. Показов 3433. Ответов 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
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 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__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
29.12.2018, 19:05
Цитата Сообщение от NiceJacket Посмотреть сообщение
от которого наследуется вновь созданный
мдя, как-то этот момент я не понял(.
0
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 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__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
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
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 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
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 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 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru