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

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

29.12.2018, 12:01. Показов 3424. Ответов 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
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
29.12.2018, 12:38
///
0
 Аватар для NiceJacket
109 / 89 / 25
Регистрация: 02.06.2018
Сообщений: 259
29.12.2018, 12:39
Лучший ответ Сообщение было отмечено Alexandr056 как решение

Решение

Java
1
2
3
new Solution(....) {
         ....
}
При такой записи создаётся не просто объект класса, а объект класса, который расширяет Solution.
В случае, если модификатор у getName - private, то вызывается метод суперкласса, с name именно суперкласса, т.е. "Риша".
Если модификатор public, то будет вызываться метод "нового" класса, где name уже "The Darkside Hacker".
Вроде так.
3
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
29.12.2018, 12:39
...
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
29.12.2018, 13:14
Цитата Сообщение от NiceJacket Посмотреть сообщение
а объект класса, который расширяет Solution
это ты где такое узнал?!
Цитата Сообщение от Alexandr056 Посмотреть сообщение
не пойму алгоритм работы,
очень помогает во всем https://www.cyberforum.ru/java/thread2250765.html
0
 Аватар для NiceJacket
109 / 89 / 25
Регистрация: 02.06.2018
Сообщений: 259
29.12.2018, 13:22
Цитата Сообщение от Aviz__ Посмотреть сообщение
это ты где такое узнал?!
https://docs.oracle.com/javase... asses.html

The anonymous class expression consists of the following:

1) The new operator

2) The name of an interface to implement or a class to extend. In this example, the anonymous class is implementing the interface HelloWorld.
1
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
29.12.2018, 13:38
NiceJacket, Ну, Бро, ты не правильно понял((, в этом контексте.
вот, гля
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 Helper {
 
    public static void main(String[] args) {
        Aa aaa = Aa.getInstance();
        System.out.println(aaa.getAnInt());
    }
}
 
class Aa {
    private int anInt;
 
    private Aa(int anInt) {
        this.anInt = anInt;
    }
 
    public int getAnInt() {
        return anInt;
    }
 
    static Aa getInstance(){
        return new Aa(5);
    }
}
0
 Аватар для NiceJacket
109 / 89 / 25
Регистрация: 02.06.2018
Сообщений: 259
29.12.2018, 14:04
Не совсем понял, к чему твой пример. Мы же об анонимных классах говорим.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Helper {
    public static void main(String[] args) {
        new Aa() {
            void newMethod() {
                System.out.println("new method");
            }
        }.newMethod();
    }
}
 
class Aa {
    
}
вопрос: это не есть ли по сути расширение класса Aa?
1
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 67
29.12.2018, 14:41  [ТС]
интересно что есть написать не анонимный класс, а аналогичный просто унаследованный от Solution , то метод getName нельзя ни вызвать ни переопределить, получается сейчас вызов возможен только потому что это анонимный класс?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.12.2018, 15:03
Цитата Сообщение от Alexandr056 Посмотреть сообщение
интересно что есть написать не анонимный класс, а аналогичный просто унаследованный от Solution , то метод getName нельзя ни вызвать ни переопределить, получается сейчас вызов возможен только потому что это анонимный класс?
Наследники не видят полей private.
new Solution("The Darkside Hacker") { ... }.printName(); это что-то новое(наследник), как и говорит NiceJacket, и над этим новым вызывается метод printName().
Наследник не видит полей private вашего new Solution (что в большем приоритете), Но он видит все поля вашего главного public class Solution (меньший приоритет), потому если неполучается "взять что хочет" он "берет что может".
Я так думаю конечно...)
1
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 26
29.12.2018, 15:08
Цитата Сообщение от NiceJacket Посмотреть сообщение
В случае, если модификатор у getName - private, то вызывается метод суперкласса, с name именно суперкласса, т.е. "Риша".
Только в точности до наоборот, как ни странно.
То есть мы можем принудительно вызвать метод суперкласса.
Вы немного удивитесь, что экземпляр класса с именем "The Darkside Hacker" является суперклассом.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package alexandr056;
 
/**
 *
 * @author vvm
 */
public class Solution {
 
    private String name;
 
    Solution(String name) {
        this.name = name;
    }
 
    private String getName() {
        return this.name;
    }
 
    private void sout() {
        new Solution("The Darkside Hacker") {
            void printName() {
                System.out.println("getName = " + getName());
                System.out.println("super.getName  = " + super.getName());
            }
        }.printName();
    }
 
    public static void main(String[] args) {
        new Solution("Риша").sout();
        
    }
}
Вывод программы:
"run:
getName = Риша
super.getName = The Darkside Hacker
BUILD SUCCESSFUL (total time: 1 second)"
1
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 67
29.12.2018, 15:21  [ТС]
Цитата Сообщение от vvm28 Посмотреть сообщение
Вы немного удивитесь, что экземпляр класса с именем "The Darkside Hacker" является суперклассом.
простите? это каким образом вы создадите новый класс, и унаследуете от него существующий, в сигнатуре которого ни слова нет про наследование?
0
29.12.2018, 15:23

Не по теме:

Alexandr056, Ставлю вам плюс за интересный, занимательный вопрос.
Если не секрет, где вы нашли такую интересную задачу?

0
 Аватар для NiceJacket
109 / 89 / 25
Регистрация: 02.06.2018
Сообщений: 259
29.12.2018, 15:38
vvm28, Да, согласен, и это не удивительно, просто я имел в виду "класс, от которого наследуется вновь созданный"

Задание, наверняка, из теста с quizful или с java rush
1
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 26
29.12.2018, 16:00
Alexandr056, Описывая анонимный класс мы уже наследуемся от какого-то класса или реализуем какой-либо интерфейс. К анонимным классам напрямую нельзя применить слова extends или implements.

Добавлено через 6 минут
Тут сложность еще в том, что у нас не только анонимные классы,но и new Solution("The Darkside Hacker") - это локальный класс. Тут наследование происходит несколько сложнее.
0
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 67
29.12.2018, 16:02  [ТС]
vvm28, NiceJacket, java rush
0
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 26
29.12.2018, 16:05
new Solution("Риша").sout(); это тоже локальный, так как вызывается в методе main()
Итого 2 локальных анонимных класса.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.12.2018, 16:32
Цитата Сообщение от vvm28 Посмотреть сообщение
Вы немного удивитесь, что экземпляр класса с именем "The Darkside Hacker" является суперклассом.
Почему он суперкласс? Он подкласс Риши, потому и super.getName() это метод Риши, и видно его потому (несмотря на то что он приватный) что нормальный getName() есть неявно this.getName(), а super.getName() это обращение к getName() Риши не как к суперклассу (инече б не было видно) а как к тому на кого имеется ссылка($) нашего анонимного класса.
Java
1
2
3
4
5
6
7
8
9
10
11
private void sout() {
        new Solution("The Darkside Hacker") {
            void printName() {
                System.out.println("getName() = " +getName());
                System.out.println("super.getName  = " + super.getName());
                System.out.println("Solution.this.getName()  = "+Solution.this.getName());
                System.out.println("equal to objects : " + Solution.this.getName().equals(getName()));
                System.out.println("compare to objects : " + (Solution.this.getName() == getName()));
            }
        }.printName();
    }
Code
1
2
3
4
5
getName() = Риша
super.getName  = The Darkside Hacker
Solution.this.getName()  = Риша
equal to objects : true
compare to objects : true
compare вроде бы показывает что это один и тот же объект.
0
 Аватар для NiceJacket
109 / 89 / 25
Регистрация: 02.06.2018
Сообщений: 259
29.12.2018, 16:38
Цитата Сообщение от vvm28 Посмотреть сообщение
new Solution("Риша").sout(); это тоже локальный, так как вызывается в методе main()
Итого 2 локальных анонимных класса.
А это ли не просто создание объекта и вызов на нём метода sout?
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.12.2018, 16:51
Кстати, в папках у меня было создано только один нормальный класс и один ..$1.class

Добавлено через 9 минут

Не по теме:

Все немного запутано ))) кто видел "Патруль времени (Predestination)" тот поймет, или нет)))

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2018, 16:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru