Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/27: Рейтинг темы: голосов - 27, средняя оценка - 4.74
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668

Наследование от внутренних классов

01.03.2014, 17:02. Показов 5773. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил разобраться с наследованием внутренних классов.

На коленке накатал небольшой тестик.
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
public class Outer {
    public Outer(int a){}
    
    public class Inner {  
        public Inner(String str, Boolean b){}   
    }
    
    public static class Nested extends Inner{
        public Nested(String str, Boolean b , Number nm)   { super("2",true);   }
    }
    
    public class InnerTest extends Nested{
        public InnerTest(){  super("str",true,12);  }
    }
}
 
class MyClass extends Outer.Inner{
      MyClass(Outer outer){
          outer.super("1",true);
      }
}
class MyClassTwo extends Outer.Nested{
    MyClassTwo(Outer outer){
        super("1",true,54.3);
    }
}
Что-то мне вообще непонятен синтаксис наследования от внутренних НЕ статических классов. почему super ?

Объсните пожалуйста
Java
1
2
3
4
5
class MyClass extends Outer.Inner{
      MyClass(Outer outer){
          outer.super("1",true);
      }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2014, 17:02
Ответы с готовыми решениями:

Наследование от внутренних классов
Почему нужно наследовать от внутренних классов именно так? import java.util.*; class Outer { class Inner {} } public class...

Создание объектов внутренних классов
Я немного не пойму. Вот получается, мы можем создавать объекты внутренних классов двумя способами: public class Outer { class Inner...

Объявление массива внутренних классов
Здравствуйте! У меня есть внешний класс Student и внутренний - Exam. Я хочу создать массив внутренних классов. Student.Exam ...

5
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.03.2014, 23:59
Лучший ответ Сообщение было отмечено gredwhite как решение

Решение

По порядку:
1. Ваш пример не компилируется - ругается на класс Nested (конструктор Nested не содержит параметр типа outer)
2. почему super? Так в java вызывают методы из родительского класса. Если у класса родителя нет конструктора без параметров - тогда мы должны вручную вызвать конструктор родителя, указав super.
3. Так как Inner классы обязаны быть привязаны к объекту своим enclosing класса (это делается компилятором, передачей параметра в конструктор), то и любой наследник inner-класса должен поддерживать это правило. (Поэтому в любом Inner классе, или наследнике должен быть конструктор, куда передается объект enclosing класса)
4. Так как в конструктор можно передать несколько объектов enclosing класса, то компилятору необходимо подсказать, к какому именно объекту он привязан - именно поэтому перед ключевым словом super при вызове конструктора нужно указать имя параметра enclosing типа.

PS. Довольно интересная фишка. Я не знал, что можно наследоваться от inner классов, вне enclosing класса
2
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
02.03.2014, 13:36  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
2. почему super? Так в java вызывают методы из родительского класса. Если у класса родителя нет конструктора без параметров - тогда мы должны вручную вызвать конструктор родителя, указав super.
3. Так как Inner классы обязаны быть привязаны к объекту своим enclosing класса (это делается компилятором, передачей параметра в конструктор), то и любой наследник inner-класса должен поддерживать это правило. (Поэтому в любом Inner классе, или наследнике должен быть конструктор, куда передается объект enclosing класса)
4. Так как в конструктор можно передать несколько объектов enclosing класса, то компилятору необходимо подсказать, к какому именно объекту он привязан - именно поэтому перед ключевым словом super при вызове конструктора нужно указать имя параметра enclosing типа.
причем судя по всему в конструктор мы передаем enclosing объект,НО(это меня очень удивило!!!) на этом enclosing объекте мы вызываем (через super) конструктор непосредственного родителя!!!

Добавлено через 2 минуты
Цитата Сообщение от turbanoff Посмотреть сообщение
1. Ваш пример не компилируется - ругается на класс Nested (конструктор Nested не содержит параметр типа outer)
Да, заметил - просто у меня IDEA без компиляции не ругалась.

Java
1
2
3
4
5
6
7
8
9
public Nested(String str, Boolean b, Number nm) { 
    new Outer(10).super("2", true);
}
 
 
 
public Nested(Outer outer) { 
    outer.super("2", true);
}
фиксится любым из вышепредложенных способов
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
02.03.2014, 18:48
Цитата Сообщение от gredwhite Посмотреть сообщение
НО(это меня очень удивило!!!) на этом enclosing объекте мы вызываем (через super) конструктор непосредственного родителя!!!
меня тоже удивил такой синтаксис, когда у Эккеля его увидел. После объяснения turbanoff стало понятно. Пример
Java
1
2
3
4
5
      class MyClass extends Outer.Inner{
      MyClass(Outer outer1, Outer outer2) {
          outer1.super("1",true);
      }
}
нужно явно указать к какому объекту привязывать объект inner класса. Можно воспринимать это как оператор "::" в С++. Синтаксис выглядит ущербно (явный костыль), но похоже это самое оптимальное решение без введения новых keyword'ов и/или других лексем.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
02.03.2014, 19:19  [ТС]
Тоже Эккель навёл на мысли - проводил ревизию знаний и вот заметил.....

имхо невыразительный синтаксис, абсолютно.

Цитата Сообщение от turbanoff
почему super? Так в java вызывают методы из родительского класса. Если у класса родителя нет конструктора без параметров - тогда мы должны вручную вызвать конструктор родителя, указав super.
не вижу никакой связи с
Java
1
2
3
public Nested(Outer outer) { 
    outer.super("2", true);
}
где тут метод родительского класса?
Где конструктор?

Добавлено через 8 минут
turbanoff ,
я к тому, что пункты 3-4 всё объяснили очень понятно, зачем пункт 2 я не понял. Просто как информация про super в java?
0
02.03.2014, 20:54

Не по теме:

Цитата Сообщение от gredwhite Посмотреть сообщение
я к тому, что пункты 3-4 всё объяснили очень понятно, зачем пункт 2 я не понял. Просто как информация про super в java?
Ну вы же спрашивали "почему super?". Я постарался наиболее точно ответить на поставленный вопрос.

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

Реализовать классы с использованием внутренних классов
Создать класс Зачетная Книжка с внутренним классом, с помощью объектов которого можно хранить информацию о сессиях, зачетах, экзаменах....

Последовательность выполнения для наследованных внутренних классов
class Egg2 { protected class Yolk { public Yolk() { print("Egg2.Yolk()"); } public void f() {...

Наследование классов
Здравствуйте! У меня такая задача: необходимо создать класс «Учащийся», содержащий следующую информацию: ФИО, пол, возраст. Предусмотреть...

Наследование классов
У меня не выходит записать в массив переменную с класса наследника import java.util.Scanner; public class AllYouNeed{ ...

Интерфейсы наследование классов
Нужно создать иерархию: класс C реализует интерфейс B и наследует класс D, B расширяет интерфейс A, класс D реализует A. Создать 4 функции,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru