2013-03-12 3 views
0
public class MainMDI extends javax.swing.JFrame { 

    private static MainMDI thiz; 

     public MainMDI() { 
     initComponents(); 
     thiz = this; 
     } 
} 

Я создаю приложение MDI в качелях. Класс MainMDI является основным классом приложения, поэтому основной метод находится в этом классе. В приведенном выше коде создается статическая переменная с именем thiz, которая указывает на экземпляр класса MainMDI при запуске приложения.Java: Когда переменная «this» инициализирована?

Я планирую использовать переменную тиз для доступа к нестатическим (экземплярам) элементам класса MainMDI из основного метода. (Я не могу получить доступ к нестационарным членам из основного метода, так как основным методом является статический член в классе MainMDI в моем приложении).

public class MainMDI extends javax.swing.JFrame { 

    private static MainMDI thiz = this; 

     public MainMDI() { 
     initComponents(); 
     } 
} 

Но при попытке инициализировать переменную Thiz, как в приведенном выше коде, компилятор говорит нестатическая переменная это не может ссылаться из статического контекста. Но я не имею в виду это в статическом контексте, вот я? Это потому, что переменная this, будучи нестатической, еще не инициализирована, когда статическая переменная это инициализируется?

Кроме того, была бы лучше практика программирования, если бы я не задал класс MainMDI как основной класс и создал другой класс с основным методом в нем и задал этот класс как основной класс?

+1

Похоже, что вам нужен синглтон. Google для этого – Bohemian

+0

Нет, мне не нужно создавать класс MainmDI singleton. Я просто хочу иметь основной метод внутри класса MainMDI, и я хочу, чтобы основной метод имел доступ к членам экземпляра класса MainMDI. – PrashanD

+1

@Prashan Предоставляя статическую переменную (aka _one_), которая ссылается на экземпляр (aka _one_) вашего класса, вы эффективно ограничиваете количество доступных экземпляров вашего класса _one_ (по крайней мере, в том контексте, в котором, по вашему мнению, получить доступ через статический метод). Наличие нескольких экземпляров и создание только последней доступной через статический _thiz_ - это то, что можно было бы решить по-другому, поэтому все неявно исключают эту опцию. Следовательно, мы все думаем, что вы действительно хотите использовать одноэлементный подход.Если вы продолжаете настаивать на ответе _no! _, Тогда вам придется описать ваш сценарий. –

ответ

5

Но при попытке инициализировать переменную Thiz, как в приведенном выше коде, компилятор говорит, не статическую переменную этого нельзя ссылаться из статического контекста. Но я не имею в виду это в статическом контексте здесь Я?

Да, вы находитесь. Статические переменные класса инициализируются при загрузке класса (а не при создании экземпляра объекта). В этом контексте нет this. Код:

private static javax.swing.JFrame thiz = this; 

Просто не работает. Несмотря на ваши утверждения об обратном, вы do хотите одиночный. В противном случае, учитывая N возможных экземпляров объекта вашего объекта MainMDI, из которого вы ожидаете получить доступ из статического контекста? Вы должны подумать о рефакторинге своего кода, а не пытаться использовать семантику языка Java.

+0

По-прежнему нет. Мне не нужен один одноклассный класс, потому что нет никакой опасности, что класс MainMDI, созданный несколько раз в моем приложении. Точка, занятая рефакторингом кода, но я не могу помочь «сильному вооружению». Таким образом, я натыкаюсь на такие проблемы и узнаю что-то из этого. – PrashanD

+2

Думаю, вам нужен синглтон Прашан. Не для предотвращения множественных экземпляров вашего объекта, а для поддержки инициализации поля из статического контекста, который вы пытаетесь сделать. Но, в любом случае, если объект только установлен только один раз, зачем вам «тиз»? – vikingsteve

+0

@vikingsteve Спасибо за комментарий. Как именно синглтон может поддерживать инициализацию поля из статического контекста? Я хотел бы узнать больше. И чтобы ответить на ваш вопрос, если вы правильно прочитали вопрос, вы поймете, почему на земле. Мне нужна переменная thiz для доступа и только для доступа к экземплярам класса MainMDI класса из основного метода. (Основной метод является статическим и его внутренним классом MainMDI, что фактически делает все экземпляры класса MainMDI недоступными для основного метода напрямую ИЛИ через переменную this. Поэтому я использую thiz для доступа к ним) – PrashanD

3

this означает «экземпляр объекта, в настоящее время работающий», он имеет смысл только внутри нестатической функции-члена. Как правило, this неявно переходит к каждой нестатической функции-члену при вызове этой функции-члена, поэтому было бы справедливо сказать, что она инициализируется непосредственно перед вызовом нестатической функции-члена.

Независимо от того, будет ли факторизация класса с использованием «основного» метода, будет зависеть от фактических деталей реализации.

Смежные вопросы