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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленький тест, :) 
:(
    Опции темы
Dummy
Дата 5.11.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 19



Цитата(Kangaroo @  30.8.2008,  21:38 Найти цитируемый пост)

public class ShadesOfGray {
    public static void main(String[] args){
        System.out.println(X.Y.Z);
    }
}

class X {
    static class Y {
        static String Z = "Black";
    }
    static C Y = new C();
}
class C {
    String Z = "White";
}


Действительно, добро. А почему именно так, а не иначе? Думаю, спустя 2 с лишним месяца можно обнародовать объяснение smile Почему компилятор при совпадении имени внутреннего класса и статической переменной выбирает именно последнюю?smile
PM MAIL   Вверх
Kangaroo
Дата 11.12.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

Репутация: 21
Всего: 104



Цитата(Dummy @  5.11.2008,  11:17 Найти цитируемый пост)
А почему именно так, а не иначе? Думаю, спустя 2 с лишним месяца можно обнародовать объяснение smile Почему компилятор при совпадении имени внутреннего класса и статической переменной выбирает именно последнюю

А все просто - так сказано в спецификации Джавы smile
Это просто надо знать. А лучше - использовать Джава Code Conventions и не волноваться.



--------------------
Lost....
PM MAIL MSN   Вверх
ivg
Дата 2.2.2009, 23:31 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Цитата(LSD @  5.4.2006,  16:06 Найти цитируемый пост)
Итак есть класс:
Код

public final class Singleton
{
  private static final Singleton singleton = new Singleton();
  private final long time = System.currentTimeMillis();
  private Singleton()
  {
    if(singleton != null)
      throw new OutOfMemoryError("Not enough memory for new Singleton ;-)");
  }
  public String toString()
  {
    return getClass().getName() + "[time = " + time + "]";
  }
  public static Singleton getInstance()
  {
    return singleton;
  }
}

вообщем самый обычный синглетон.
Задача состоит в том, чтобы создать два экземпляра класса Singleton, так чтобы s1 != s2. 

Код

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {
        Singleton s = Singleton.getInstance();
        Constructor<Object> objCons = Object.class.getConstructor();
        Constructor<Singleton> c = sun.reflect.ReflectionFactory.getReflectionFactory()
            .newConstructorForSerialization(Singleton.class, objCons);
        Singleton s2 = c.newInstance();
        System.out.println(s.getClass() == s2.getClass());
        System.out.println(s == s2);
    }

К чему это я? smile К тому, что в байт коде Java, команды создания объекта класса и собственно вызов конструктора никак не связаны, а точнее легко отделить одно от другого. Компилятор конечно такие вещи не позволяет делать. Однако если сделать класс Singleton сериализуемым, то легко создаётся новый объект через сериализацию-десериализацию. И при этом конструктор Singleton'а не вызывается. Вот мне стало интересно как же так, попробовал решить задачку, не меняя определение класса. Покопался в исходниках, результат выше. При этом вызывается конструктор базового класса, в данном случае класса Object. Это как бы противоречит идее конструирования объектов, но речь идёт о десериализации, поля объекта заполняются значениями, состояние восстановлено, вроде как можно обойтись без вызова конструктора Singleton.
PM MAIL   Вверх
Се ля ви
Дата 27.3.2009, 23:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Задачка на понимание абстрактных классов.

Известно, что при наследовании мы должны вызывать конструктор суперкласса из конструктора нашего класса, передавая ему все нужные параметры. Таким образом, получается, что каждый объект класса-потомка как бы инкапсулирует в себе экземпляр класса-предка, который инкапсулирует экземпляр своего предка и т.д. по всей иерархии наследования до самого Object`а. Т.е., создавая просто один экземпляр объекта, мы на самом деле создаём пирамидку объектов всех его предков.

После создания этого экземпляра класса-предка, он становится доступен по ссылке-ключевому слову super.

Теперь - к абстрактным классам. При наследовании от них мы тоже должны вызывать конструктор, соответственно, создавать их экземпляр. Соответственно, по ссылке super становится доступно то, чего сделать невозможно по всем канонам ООП - экземпляр абстрактного класса!!! После этого мы в каком-нибудь из методов можем написать 
Код
return super;
 и тем самым, что называется, выпустить этот экземпляр абстрактного класса в свет smile.

Собственно, вопрос - без проверки скажите, что будет, если вызвать у него метод, объявленный абстрактным?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Kangaroo
Дата 28.3.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

Репутация: 21
Всего: 104



Цитата(Се ля ви @  27.3.2009,  23:42 Найти цитируемый пост)
без проверки скажите, что будет, если вызвать у него метод, объявленный абстрактным? 

Мне кажется, что выполнится метод класса с "return super;". Но это так, наугад smile

Добавлено @ 00:04
Ща проверим

Не ожидал такого подвоха. Слепая вера заслепила разум smile

Это сообщение отредактировал(а) Kangaroo - 28.3.2009, 00:19


--------------------
Lost....
PM MAIL MSN   Вверх
AlexeyVorotnikov
Дата 30.3.2009, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 18



Мне кажется, что вызовется переопределённый метод в классе-потомке.

Хотя... надо проверить.

Добавлено @ 12:25
"Как обманчива природа, подумал ёжик, слезая с кактуса"

Это сообщение отредактировал(а) AlexeyVorotnikov - 30.3.2009, 11:32


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
chaos
Дата 30.3.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



Цитата(Се ля ви @ 27.3.2009,  20:42)
Собственно, вопрос - без проверки скажите, что будет, если вызвать у него метод, объявленный абстрактным?

вызовется метод наследника не соберется пример

Это сообщение отредактировал(а) chaos - 30.3.2009, 09:47
PM WWW   Вверх
Kangaroo
Дата 30.3.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

Репутация: 21
Всего: 104



Цитата(AlexeyVorotnikov @  30.3.2009,  09:33 Найти цитируемый пост)
"Как обманчива природа, подумал ёжик, слезая с кактуса"

Хе-хе, никто не ожидал такого подвоха smile


--------------------
Lost....
PM MAIL MSN   Вверх
chaos
Дата 31.3.2009, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



Се ля виKangaroo объясните в чом подвох?

Код

abstract class A { 
    public abstract void foo();
}

class B extends A {
    public void foo() {
        System.out.println("B::foo");
    }

    public A getA() {
        return this;
    }
}


зачем писать return super не пойму. при проверки компилятор ругается.

Это сообщение отредактировал(а) chaos - 31.3.2009, 07:20
PM WWW   Вверх
Се ля ви
Дата 9.4.2009, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



chaos, короче, super - это не совсем ссылка. Есть ограничения на использование этого ключевого слова как раз, что бы такого не было. Оно служит:
  • В конструкторе - для вызова конструктора класса-предка
  • В любом другом методе - для вызова его методов и полей
Всё. Больше его никак юзать нельзя. Тут не только компилятор, тут даже любая среда разработки заругается. Я это называю "ошибкой уровня написания кода" наряду с "ошибкой уровня компиляции" и "ошибкой уровня выполнения" smile


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
chaos
Дата 14.4.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



Се ля ви, ну я так и понял. что только для вызова конструктора и методов базового класса
PM WWW   Вверх
Thor_75t
Дата 2.10.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Се ля ви @ 27.3.2009,  23:42)
Задачка на понимание абстрактных классов.
Теперь - к абстрактным классам. При наследовании от них мы тоже должны вызывать конструктор, соответственно, создавать их экземпляр. Соответственно, по ссылке super становится доступно то, чего сделать невозможно по всем канонам ООП - экземпляр абстрактного класса!!! После этого мы в каком-нибудь из методов можем написать 
Код
return super;
 и тем самым, что называется, выпустить этот экземпляр абстрактного класса в свет smile.

Собственно, вопрос - без проверки скажите, что будет, если вызвать у него метод, объявленный абстрактным?

Насчёт задачи Се ля ви-
Я поддерживаю Kangaroo и тоже считаю что выполнится метод того класса, в котором вызывается метод 
абстрактного класса, или словами AlexeyVorotnikov -"вызовется переопределённый метод в классе-потомке".
Переопределяя абстрактный метод при наследовании мы тем самым ставим его в очередь диспетчеризации, из 
которой выбирается наиболее подходящий метод. 
Я попытался написать код под эту ситуацию, если ошибаюсь, просьба- ткнуть меня в правильный код smile
Учил учил книгу, потом попал на ваш форум, порешал задачки примерно с 2004 года, получалось может меньше 50% да и то с горем 1\2 smile  И тогда на меня снизошло-
что я пока стою на 1м этаже безграничного "java" небоскрёба  smile  ещё подниматься и подниматься  smile   Зато здорово что есть такой форум smile 
Код

abstract class AbCl{    
    abstract void m1();
}
class SubCl extends AbCl{
    
    void xmm() {        
        try {
            AbCl ob=super.getClass().newInstance();
            ob.m1();            
        }catch(Exception oO) { System.out.println("SubCl.xmm()"+oO);}
    }    
    void m1() { System.out.println("+++++++");}
}
public class AbstractObjCreate {    
    public static void main(String[] args) {
        SubCl obj=new SubCl();
        obj.xmm();
        System.out.println("AbstrObjCreate.main()");        
    }
}


Это сообщение отредактировал(а) Thor_75t - 2.10.2009, 01:49
PM MAIL   Вверх
fedrbodr
Дата 9.4.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
Сегодня столкнулся с одно интересностью и родилась задача))
Что будет в результате?
Код

        SimpleDateFormat format = new SimpleDateFormat("ddMMyy");
        Date date = format.parse("01021A");
        System.out.println(format.format(date));

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


Leprechaun Software Developer
****


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

Репутация: 209
Всего: 537



Честно говоря я не в восторге от подобной особенности DateFormat-а.


--------------------
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   Вверх
Самозванка
Дата 25.5.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Девушка в стиле IT
**


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

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



Есть связаный однонаправленный список... Каким образом распечатать его задом наперед.... Привести несколько вариантов...


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

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

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


 




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


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

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