Статична препратка и използване на обекти, които са инициализирани извън main?

Имам въпрос относно използването на предмети...

Имам клас, наречен Area, който съдържа няколко метода. Искам да получа достъп до тези методи в друг клас, в който е създаден обект Area.

public class calcAreaObj {
Area areaObj = new Area();

public static void main(String[] args){
            areaObj.area(2,3,4);

}

}

Защо, когато класът е създаден, както по-горе, получавам грешка („Не може да се направи статична препратка към нестатично поле areaObj. Но когато изходният код е написан така, че обектът Area се инициира вътре в главния израз, както по-долу има няма грешки...

public class calcAreaObj {

public static void main(String[] args){
    Area areaObj = new Area();
    areaObj.area(2,3,4);
}

}

Дали това е така, защото в първия случай обектът Area се инициализира извън статично изявление? Ако е така, защо това има значение?


person RamanSB    schedule 30.06.2015    source източник


Отговори (3)


Това е така, защото когато е дефиниран в обхвата на класа, areaObj е специфичен за всеки екземпляр на calcAreaObj. Това всъщност не е това, което искате, тъй като main е статичен метод (и затова няма екземпляр на calcAreaObj, свързан с него). Можете или да използвате втория примерен код, който сте публикували, или можете да промените първия, както следва:

public class calcAreaObj {
static Area areaObj = new Area();

public static void main(String[] args){
            areaObj.area(2,3,4);

}

}

Освен това, ако areaObj няма никакво състояние, в този случай винаги можете да декларирате Area.area като статичен.

person nanofarad    schedule 30.06.2015

В първия пример areaObj е нестатичен член на calcAreaObj. Това означава, че може да бъде достъпен само чрез екземпляр на calcAreaObj.

new calcAreaObj().areaObj.whatever(); //this will work
calcAreaObj.areaObj; //areaObj isn't a static member, won't work

Накратко: нестатичният член дори не съществува, докато не сте създали екземпляр на calcAreaObj. Във втория пример той е в обхвата на метода и следователно е достъпен.

person Paul    schedule 30.06.2015

За първата ситуация създавате локална променлива за класа, който няма връзка с обекта, използван в основния. Следователно трябва да инициализирате обекта отново в главния.

Има правило: че всеки блок има свои собствени променливи. Така че, ако инициализирате променлива в блок и се опитате да я използвате извън блока, това ще ви даде грешка.

Например:

public static void main(String [] arg){

{ Area a = new Area(); }

double number = a.area

}

това не работи...

Иска ми се да е ясно

person Mohammed Alsayed    schedule 30.06.2015