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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день коллеги! Всех с наступающим! Есть вот такой кусок кода :
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2018, 12:01
Ответы с готовыми решениями:

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

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

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

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

28
729 / 435 / 66
Регистрация: 22.12.2013
Сообщений: 2,292
Записей в блоге: 19
29.12.2018, 18:45 21
Author24 — интернет-сервис помощи студентам
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
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
29.12.2018, 19:05 22
Цитата Сообщение от NiceJacket Посмотреть сообщение
от которого наследуется вновь созданный
мдя, как-то этот момент я не понял(.
0
729 / 435 / 66
Регистрация: 22.12.2013
Сообщений: 2,292
Записей в блоге: 19
29.12.2018, 19:08 23
И более простое объяснение. Наследуются только public поля, private не наследуются.
Точнее наследуется, всё. Но мы обычным способом, можем получить доступ только к public полям суперкласса.
1
vvm28
29.12.2018, 19:14
  #24

Не по теме:

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

Размер: 15.7 Кб

0
NiceJacket
29.12.2018, 19:17
  #25

Не по теме:

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

0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
29.12.2018, 19:26 26
Цитата Сообщение от NiceJacket Посмотреть сообщение
Aviz__, присоединялся бы
не последняя, Бро, полемика)). Истина многогранна!
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.12.2018, 20:17 27
Цитата Сообщение от 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
729 / 435 / 66
Регистрация: 22.12.2013
Сообщений: 2,292
Записей в блоге: 19
29.12.2018, 21:16 28
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
729 / 435 / 66
Регистрация: 22.12.2013
Сообщений: 2,292
Записей в блоге: 19
27.06.2019, 22:37 29
PS. Здесь мне нужно сделать уточнение.
Я написал
Java
1
 this.name = "Новое имя анонимного класса";
Это не совсем точно. У анонимного класса есть имя "скрытое от посторонних глаз".
Здесь я просто задаю переменную типа String - это не реальное имя экземляра класса, а только некоторая заданная мной переменная.
Так я не задаю "реальное" имя экземпляру класса, а как-то обозначаю экземпляр класса.
То есть, как вы понимаете я задал переменную, чтобы просто как-то обозначить этот экземпляр класса.
Но в таком виде у меня будут одинаковые имена для всех экземпляров этого класса.
Чтобы немного доработать код можно дописать метод setName, чтобы задавать переменную
Java
1
private String name;
Но это по сути ненужное извращение, поскольку сам смысл анонимного класса
теряется. А смысл его использования это сокрытие данных внутреннего анонимного класса от внешнего воздействия, с целью предотвращения повреждения данных извне.
0
27.06.2019, 22:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2019, 22:37
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru