Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение из внутреннего класса во внешний 
V
    Опции темы
ShurikA
Дата 26.1.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Есть такое строение классов:
Код

public class A{
  public static class B{
  .
  .
  .
  }
}


из В обратиться в А?

во всяком слачае вот такой способ:
Код

A.this.someMethod();


Это сообщение отредактировал(а) ShurikA - 27.1.2007, 16:19


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Anklav
Дата 27.1.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.12.2003
Где: Менск

Репутация: нет
Всего: 1



объяви класс B не статическим:
Код

public class A {
  public class B {
  }
}

статическому внутреннему классу ничего не известно о внешнем

Это сообщение отредактировал(а) Anklav - 27.1.2007, 00:22
PM ICQ   Вверх
powerOn
Дата 27.1.2007, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Из статического внутреннего класса нельзя обращаться к не статическим полям и методам внешнего класса. 
Чтобы из класса  B обратиться к не статическому методу или полю класса А нужно чтобы класс А был не статическим.
(А чтобы создать экземпляр внутреннего не статического класса необходимо прежде создать объект внешнего класса:

Код

public class Main
{
    public class Test 
    {
        public Test()
        {
            Main.this.test();
        }
    }

    public Main()
    {
    }
    
    public void test()
    {
        System.out.println("Test!");
    }

    public static void main(String[] args)
    {
        new Main().new Test();
    }
}
)

Это сообщение отредактировал(а) powerOn - 27.1.2007, 00:24


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
ShurikA
Дата 27.1.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



ОК, допустим я переделываю public static class B в public class B то с этим классом всё нормално.
Но как только я пытаюсь зодать обьект класса В, вот таким образом:
Код

dTmpl.AddImgTmpl(new ImgTmpl(rect));

когда ImgTmpl это В

то уже при работе проги (компиляцию она проходит хормално), вылетает ошибка:

Код

C:\Private\Java\JavaDev\ApisServer\src\apisserver\DBMgr\DBMgr.java:98: an enclosing instance that contains dataclasses.DataClasses.DesignTemplate.ImgTmpl is required


и как с этом бороться?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 27.1.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(ShurikA @  27.1.2007,  16:18 Найти цитируемый пост)
то уже при работе проги (компиляцию она проходит хормално), вылетает ошибка:

Как это при работе? smile  Ты запускаешь DBMgr.java (исходник)? smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 27.1.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(LSD @  27.1.2007,  15:21 Найти цитируемый пост)
Как это при работе?

Извиняюсь моя ошибка, при компиляции.

Добавлено @ 16:41 
вот этот кусок кода:

Код

import dataclasses.DataClasses.DesignTemplate;
import dataclasses.DataClasses.DesignTemplate.ImgTmpl;
import dataclasses.DataClasses.DesignTemplate.TextTmpl;
.
.
.
 public DesignTemplate BuildTemplate(int id, StringBuffer str) throws Exception {
        DesignTemplate dTmpl = new DesignTemplate(id);
        Rectangle rect = new Rectangle();
        String PICTURE = "picture";
        String TEXT = "text";
        String type;
        Statement statment = null;
        String sql = "SELECT apis_bg.id AS bg_id, apis_bg.`bgfile`, "+
                "apis_frames.`id` AS t_id, `x` , `y` , "+
                "`width`, `height` , apis_frames.`type` "+
                "FROM `apis_bg` LEFT JOIN `apis_frames` ON(apis_bg.id = apis_frames.bgid) "+
                "WHERE apis_bg.id =" + id;
        ResultSet rs = null;
        statment = this.GetConnection().createStatement();
        rs = statment.executeQuery(sql);
        if (rs.next()) {
            dTmpl.SetBgImagePath("http://photorakurs.net.ru/forum/sources/gallery/images/"+rs.getString("bgfile"));
            if(rs.getString("t_id") != null){
                rect.setBounds(rs.getInt("x"), rs.getInt("y"), rs.getInt("width"),
                        rs.getInt("height"));
                type = rs.getString("type");
                if (type.equals(PICTURE)) {
                    dTmpl.AddImgTmpl(new ImgTmpl(rect));
                } else if (type.equals(TEXT)) {
                    dTmpl.AddTextTmpl(new TextTmpl(rect));
                }
            }
        }
        
        while (rs.next()) {
            rect.setBounds(rs.getInt("x"), rs.getInt("y"), rs.getInt("width"), rs.getInt("height"));
            type = rs.getString("type");
            if (type.equals(PICTURE)) {
                dTmpl.AddImgTmpl(new ImgTmpl(rect));
            } else if (type.equals(TEXT)) {
                dTmpl.AddTextTmpl(new TextTmpl(rect));
            }
        }
        
        if (rs != null) {
            rs.close();
        }
        
        if (statment != null) {
            statment.close();
        }
        
        return dTmpl;
    }



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 27.1.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Проблемма решилась, но правда каким то странным образом:
Создавать обьект нужно в таком слачае вот так:
Код

dTmpl.new ImgTmpl(rect);

когда dTmpl это типа класс А...

Работает, но я не понимаю почему именно так...
Кто то может пояснить, я явно тут чего то пропустил, в понимании.


P.S. 
Мне сразу эта тема кое что напомнила:
"У теоретиков ничего не работает, но они знают почему;
у практиков всё работает, но не могу понять почему...
У нас обычно ничего не работает, и мы не можем обьяснить почему!"   smile  


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 27.1.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(ShurikA @  27.1.2007,  16:58 Найти цитируемый пост)
Работает, но я не понимаю почему именно так...
Кто то может пояснить, я явно тут чего то пропустил, в понимании.

В не статическом внутреннем классе есть ссылка на объект внешнего класса (enclosing instance). Эта ссылка всегда не null, если объект внутреннего класса создается в не статическом методе, то эта ссылка автоматом инициализируется указателем на объект в методе которого был вызван конструктор.
А вот если создание происходит в статическом методе, то ссылку на объект базового класса надо передать явно, что и делает такой код:
Код
dTmpl.new ImgTmpl(rect);


P.S. Если dTmpl будет null то будет сгенерированно исключение NullPointerException.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 27.1.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Да, но в данный момент мои внутрение классы не статические.

Добавлено @ 17:15 
и ещё одно, что это озночает:
http://www.thecatalog.biz/servlet/apisserv...plate&tId=1

при этом компиляцию проходит без проблемм.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
powerOn
Дата 27.1.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(ShurikA @  27.1.2007,  16:58 Найти цитируемый пост)
Проблемма решилась, но правда каким то странным образом:
Создавать обьект нужно в таком слачае вот так:


Ну а мой пост выше ты читал? 

К статическим полям/методам любого класса можно обращаться по их именам (если конечно область видимости позволяет). Если поле - то по имени поля, если метод - то по имени метода, если внутренний статический класс, то создать его экземпляр можно используя конструкцию:
Код

new OutterClassName.InnerClassName(param...);


если же внутренний класс не является статическим, а создать его хочется, то необходимо сначала создать экземпляр внешнего класса, а потом только экземпляр внутреннего:
Код

new OutterClassName(param...).new InnerClassName(param...);


Из внутреннего статического класса нельзя получить доступ к нестатическим полям и методам внешнего класса. Из внутреннего нестатического класса можно, используя конструкцию:

Код

OutterClassName.this.outterNotStaticMetodt();



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 27.1.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Значит ты или вызываешь конструктор внутреннего класса из статического метода, или из метода объекта который не является enclosing class для данного внутреннего класса.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 27.1.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Извините, но у меня уже руки опустились...
Проблеммы просто одна за другой. smile

Добавлено @ 17:23 
Цитата(powerOn @  27.1.2007,  16:17 Найти цитируемый пост)
если же внутренний класс не является статическим, а создать его хочется, то необходимо сначала создать экземпляр внешнего класса, а потом только экземпляр внутреннего:

код Java
1:

new OutterClassName(param...).new InnerClassName(param...);



правильно ли вместо new OutterClassName(param...) воспользоваться уже созданным обьектом этого класса?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
powerOn
Дата 27.1.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(ShurikA @  27.1.2007,  17:17 Найти цитируемый пост)
правильно ли вместо new OutterClassName(param...) воспользоваться уже созданным обьектом этого класса? 

Да, можно воспользоваться. 
Дополнительно, следует учесть, что один экземпляр внешнего класса может иметь много экземпляров внутреннего класса. А экземпляры внутреннего класса могут менять поля своего внешнего класса.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
ShurikA
Дата 27.1.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



ну вот притакой конфигурации вилетает ошибка показанная по ссылке...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 27.1.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Код

java.lang.NoSuchMethodError: dataclasses.DataClasses.DesignTemplate$ImgTmpl.<init>(Ljava/awt/Rectangle;)V
    apisserver.DBMgr.DBMgr.BuildTemplate(DBMgr.java:98)


что бы это могло означать, при том что цтрока 98 это:
Код

dTmpl.AddImgTmpl(dTmpl.new ImgTmpl(rect));



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1411 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.