729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
1

Внутренние классы и наследование

21.03.2016, 20:07. Показов 1679. Ответов 19
Метки нет (Все метки)

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
/**
 
 * @author vvm28
 
 */
class Parent{}
 
public class OuterClass4 
{
     public OuterClass4(){}
     
     /*наследуем внутренний класс от класса пакета Parent*/
     static class InnerClass extends Parent
            { 
         
            }
     
     public static void main(String[] args) 
            {
 
            }
    
}
Подскажите,пожалуйста, случаи использования, преимущества и недостатки такого подхода.

Добавлено через 1 час 8 минут
Хотелось бы придумать какие-то ассоциации из реальной жизни.
То есть, например - это какие-то объекты реальной жизни. Но, что-то, ничего не придумывается.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2016, 20:07
Ответы с готовыми решениями:

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

Внутренние классы
Всем привет! Есть такое задание: "1) Создайте класс MyLine. 2) Создайте внутренний класс...

Внутренние классы
Здравствуйте! Увидел в философии Java пример похожий на этот (сюда пишу свой, принципиально от...

Внутренние классы
Есть внутренний класс, в нём нужно получить ссылку на внешний. Как это можно сделать?

19
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
21.03.2016, 23:15 2
Я что-то не уловил, суть какого именно подхода вы хотите понять?
Вы хотите узнать, зачем нужны inner классы?
0
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
22.03.2016, 08:27  [ТС] 3
Цитата Сообщение от turbanoff Посмотреть сообщение
Вы хотите узнать, зачем нужны inner классы?
Можно вопрос сформулировать так. Но больше интересует область практического применения.
И для этого написать классы с "реальными" объектами. Если вас не затруднит напишите не код, а ассоциации
с объектами "реального" мира. На кавычки в тексте не обращайте внимания.
Ну или подскажите псевдо код взаимодействия объектов, построенных на внутренних классах с наследованием внутреннего класса.
0
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
23.03.2016, 19:32  [ТС] 4
Пример кода:
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
/*
  Внутренние классы и наследование
 */
 
/**
 *
 * @author vvm28
 */
class Parent2{
private int prParensVar;
public int pubParensVar;
}
public class OuterClass5 {
     public OuterClass5(){}
      /*наследуем внутренний класс от класса пакета Parent2*/
     static class InnerClass extends Parent2
            { 
                void showPrivateOfParent()
                {
      //нет доступа  System.out.println("prParensVar ="+super.prParensVar);
      System.out.println("pubParensVar ="+super.pubParensVar); // есть доступ  
                }
            }
public static void main(String[] args) 
            {
 
            }
}
Из этого примера мы видим, что можем иметь доступ к открытым переменным класса предка нашего внутреннего
класса. При этом "внешний", то есть класс "оболочка" не наследуется от класса Parent2.

Добавлено через 5 часов 20 минут
Хотелось бы придумать некоторые аналогии из предметного мира.
Например: "Эта конструкция классов похожа на то-то то-то по своему поведению"
Такое описание показывает более простое и понятное объяснение.
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
23.03.2016, 21:12 5
Это не inner-класс, а nested-класс. Inner-классами называются классы, создаваемые в контексте объекта, а не класса. Т.е. не static.
0
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
25.03.2016, 00:32  [ТС] 6
Тогда получается, что Inner класс - это просто член класса. То есть класс как тип переменной?
Или наоборот? Можно посмотреть простой пример Inner класса и Nested.
У меня такое ощущение, что все несколько проще, чем я себе представляю и городить огород смысла нет.
Объект класса созданный в неком внешнем классе это что?

Добавлено через 6 минут
Джошуа Блох пишет нам так:
"Класс называется вложенным (nested), если он определен внутри другого класса."

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

Добавлено через 14 минут
Стал редактировать и отменились изменения текста. Как вернуть предыдущий вариант?

Добавлено через 36 минут
Предыдущий вариант этого сообщения.

Добавлено через 3 минуты
Вернуть на время: 24.03.2016 17:28.
Такое возможно?
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
25.03.2016, 07:30 7
Цитата Сообщение от vvm28 Посмотреть сообщение
Можно посмотреть простой пример Inner класса и Nested.
Можно.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
interface Calc {
    int calc();
    default void println() {
        System.out.println(this.getClass().getSimpleName() + ": " + calc());
    }
}
 
class SomeClass {
 
    private int x;
 
    public SomeClass(int x) {
        this.x = x;
    }
 
    public class InnerSum implements Calc {
        private int y;
        public InnerSum(int y) {
            this.y = y;
        }
        public int calc() {
            return x + y;
        }
    }
 
    public static class Nested implements Calc {
        private int y;
        public Nested(int y) {
            this.y = y;
        }
        public int calc() {
            return y; // x is not available here
        }
    }
}
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
 
    public static void main (String[] args) throws java.lang.Exception {
        SomeClass a = new SomeClass(12);
        Calc ai = a.new InnerSum(34);
        Calc an = new SomeClass.Nested(34);
        ai.println();
        an.println();
    }
}
http://ideone.com/xGdJO3
0
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
25.03.2016, 09:47  [ТС] 8
korvin_, спасибо.
Только в вашем примере class InnerSum нужно сделать абстрактным или определить метод println() :
Java
1
2
3
4
@Override
        public void println() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
class Nested тоже определить метод println().

Я немного доделал ваш пример:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 Inner , Nested
 */
package korvin_;
 
/**
 * 
 * @author vvm28
 */
class SomeClass {
 
    private int x;
 
    public SomeClass(int x) {
        this.x = x;
    }
 
    public class InnerSum implements Calc {
     // abstract public class InnerSum implements Calc {
        private int y;
        public InnerSum(int y) {
            this.y = y;
        }
        public int calc() {
            return x + y;
        }
 
        @Override
        public void println() {
            System.out.println("hello from InnerSum.println()");
           // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }
 
    public static class Nested implements Calc {
        private int y;
        public Nested(int y) {
            this.y = y;
        }
        public int calc() {
            return y; // x is not available here
        }
 
        @Override
        public void println() {
            System.out.println("hello from Nested.println()");
          //  throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }
}
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
 
    public static void main (String[] args) throws java.lang.Exception {
        SomeClass a = new SomeClass(12);
        Calc ai = a.new InnerSum(34) {
            @Override
            public void println() {
                System.out.println("Hello from ai InnerSum.println");
               // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        }; // исключение
        Calc an = new SomeClass.Nested(34);
        ai.println();
        an.println();
    }
}
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
25.03.2016, 11:25 9
Цитата Сообщение от vvm28 Посмотреть сообщение
Только в вашем примере class InnerSum нужно сделать абстрактным или определить метод println()
Зачем?
0
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
25.03.2016, 14:25  [ТС] 10
Посмотрю позже. Голова уже гудит, формулы и коды сниться начали.
0
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
14.04.2016, 22:45  [ТС] 11
Хорошо, я почитал довольно много про вложенные и внутренние классы.
Придумал такой код:
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
/**
 *
 * @author vvm
 */
public class Outer4 {
    
    public static void main(String[] args) {
          
        
        Outer4 o = new Outer4()
            {
                final class AuMethod{
                    AuMethod(){
                        method();
                        }
                    void method(){
                        System.out.println("Ua");
                    }
 
                }
 
                AuMethod au = new AuMethod();
 
            };
        
        
        
    }
}
Как такую конструкцию классифицировать? Я имею в виду код вида Outer4 o = new Outer4(){};
Что синтаксически делают фигурные скобочки? Как я понимаю в скобочках я могу добавить новые методы и новую
функциональность моему классу Outer4.
Как называется класс AuMethod в терминологии - локальный, внутренний, вложенный?
Если он , этот класс связан в контексте экземпляра, то это внутренний класс?
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
16.04.2016, 20:00 12
Цитата Сообщение от vvm28 Посмотреть сообщение
Как такую конструкцию классифицировать? Я имею в виду код вида Outer4 o = new Outer4(){};
Создание объекта анонимного класса, наследуемого от класса Outer4.
1
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
17.04.2016, 11:39  [ТС] 13
Спасибо. Очень полезная информация. Не могли бы вы подсказать, где можно почитать про анонимные классы?
Случаи использования анонимных классов. Интересует практическое применение. На форумах я конечно найти могу сам, но может подскажете изданную литературу по этому вопросу.
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
17.04.2016, 12:28 14
Цитата Сообщение от vvm28 Посмотреть сообщение
где можно почитать про анонимные классы?
Конечно же в документации.
0
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
02.03.2017, 22:24  [ТС] 15
Написал небольшую статью на тему внутренних классов.
Долго писал, потом коды придумывал, тестировал.
Если интересно, то можете посмотреть в моем блоге черновик:
https://www.cyberforum.ru/blog... g4605.html
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
02.03.2017, 23:16 16
Лучший ответ Сообщение было отмечено vvm28 как решение

Решение

Цитата Сообщение от vvm28 Посмотреть сообщение
Написал небольшую статью на тему внутренних классов.
Настолько бестолковую и некорректную, что она не только бесполезна, но и вредна. Ты ни чему не научился за почти год.
1
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
03.03.2017, 13:09  [ТС] 17
Цитата Сообщение от korvin_ Посмотреть сообщение
Настолько бестолковую и некорректную, что она не только бесполезна, но и вредна. Ты ни чему не научился за почти год.
Ну почему же. Получил уже несколько сертификатов по java.
А вот ваше высказывание без аргументов, просто голословно.

Добавлено через 19 минут
Критика, это вам не разбрасывание пустых слов. Поэтому критиков зовут критиками, а не кретинами.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.03.2017, 11:29 18
Цитата Сообщение от vvm28 Посмотреть сообщение
Получил уже несколько сертификатов по java
Расшарьте в certview чтобы можно было глянуть. Или дайте ссылки на бейджи в acclaim-е.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
09.03.2017, 11:54 19
HighPredator, тем не про сертификаты ТС. Нестоит разводить оффтоп
1
729 / 430 / 66
Регистрация: 22.12.2013
Сообщений: 2,289
Записей в блоге: 19
17.05.2017, 06:41  [ТС] 20
HighPredator, успехи в получении сертификатов скромные.
Миниатюры
Внутренние классы и наследование   Внутренние классы и наследование  
Изображения
 
0
17.05.2017, 06:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2017, 06:41
Помогаю со студенческими работами здесь

Внутренние классы и интерфейсы
Добрый вечер! Решаю задачку из Эккеля по внутренним классам, реализующим интерфейсы. В трех разных...

Внутренние классы (сокрытие реализации)
Когда мы создаем внутренний класс и объявляем его поля/методы приватными, они все равно доступны...

Внутренние классы и Говорящие часы
package VnutrClass; import java.awt.*; import java.awt.event.*; import java.util.*; import...

Внутренние классы. Разобраться с областью видимости
Услышал такое утверждение: что внутренние классы видят все закрытые переменные не только класса в...


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

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

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