Понимание этого способа создания нового объекта - PullRequest
1 голос
/ 22 июня 2011

Я только начал разработку BlackBerry, и я следую некоторым учебникам, чтобы ознакомиться с объектами пользовательского интерфейса и так далее, и я увидел / попробовал это:

private MenuItem menuItemClose = new MenuItem(new StringProvider("Contacts"), 0, 0) {
    public void run() {
        onClose();
    }
};

Я не видел такого способа создания экземпляраобъект до (думая о новом MenuItem), может кто-нибудь объяснить, что происходит?

И в чем разница между созданием экземпляров объектов внутри определений методов и в «разделе переменных экземпляра», как это?

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Это называется «анонимный внутренний класс».

Анонимные внутренние классы - это классы, которые создаются внутри другого класса, но не имеют имен. Они создаются в соответствии с их интерфейсом или определением абстрактного базового класса, а их отсутствующая реализация находится в одном ряду с экземпляром.

В этом случае MenuItem является абстрактным - в нем отсутствует метод run (). Вы предоставляете реализацию его метода run () в строках 2-4.

Посмотрите эту статью JavaWorld для получения дополнительной информации о различных типах и использовании внутренних классов.

Что касается второй части вашего вопроса "в чем разница между созданием экземпляров объектов внутри определений методов и в" разделе переменных экземпляра ", как это?" - разница в объеме, и когда объект создается.

Нестатические переменные-члены с начальными значениями создаются при создании экземпляра объекта, который их содержит. Начальное присвоение значения (инициализация) также выполняется в это время.

Статические переменные-члены с начальными значениями создаются и инициализируются, когда класс загружается загрузчиком классов виртуальной машины. С нетерпением ClassLoading это произойдет в начале приложения. При использовании отложенного ClassLoading это произойдет при первом обращении к классу приложения. Я считаю, что по умолчанию большинство классов, не являющихся частью среды выполнения Java, загружаются лениво.

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

Нестатические переменные-члены являются частью экземпляра объекта и, как таковые, они помечаются для сборки мусора, когда этот экземпляр теряется или выходит из области видимости. Переменные статического члена собираются только в том случае, если класс, содержащий их, выгружен. Это происходит только в том случае, если экземпляр ClassLoader, который загрузил указанный класс, является сборщиком мусора. См. этот вопрос для получения дополнительной информации об этом.

Локальные переменные (переменные, которые определены в методе) с начальными значениями создаются и инициализируются, когда эта строка выполняется как часть нормального выполнения метода. Они помечаются для сборки мусора (уничтожаются) после выхода из области видимости (после завершения выполнения метода, в котором они содержатся).

1 голос
/ 22 июня 2011

Когда вы определяете новый внутренний класс внутри вызова метода, он называется «анонимным внутренним классом».Анонимные внутренние классы полезны, когда вам не нужна ссылка на объект после первоначального вызова метода.

final Object obj = new Object(); // Standard instantiation
System.out.println(obj); // Prints java.lang.Object@5c005c

// Anonymous inner class
System.out.println(new Object() { }); // Prints Foo$1@2500250

// Anonymous inner classes work with interfaces too
new Thread(new Runnable() {

    @Override
    public void run() {
        // Runnable is an interface
    }

}).start();

Это довольно распространенный шаблон, который может быть полезен для определения «одноразового использования».объекты, возможно, за счет читабельности.

1 голос
/ 22 июня 2011

Это создает анонимный внутренний класс, который расширяет MenuItem и переопределяет метод run. Это стандартная Java и не имеет ничего общего с Blackberry.

...