Извикване на публична нестатична променлива или метод без инстанциране на неговия клас

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


person TMKS    schedule 30.10.2013    source източник
comment
Защо не направите метода static?   -  person Luchian Grigore    schedule 30.10.2013


Отговори (6)


В Java няма начин да се извикат нестатични променливи, т.е. членове на екземпляр без instance.

Има причина за това, от Разбиране на членове на екземпляр и клас

Когато няколко обекта са създадени от един и същи план на клас, всеки от тях има свои собствени отделни копия на променливи на екземпляр.

Където като статични методи принадлежи към класа, а не към конкретния instance

person Suresh Atta    schedule 30.10.2013

Не, защото нарушава самата цел на статиката

person Hussain Akhtar Wahid 'Ghouri'    schedule 30.10.2013

Не, няма смисъл да се извиква променлива на екземпляр без екземпляр.

person ManOnMars    schedule 30.10.2013

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

person SpringLearner    schedule 30.10.2013

Имате нужда от обект, за да извиквате нестатични методи, но не е задължително да е обект от класа, където е дефиниран методът - може също да бъде обект от подклас на този клас.

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

Имайте предвид, че този метод е хакерски и опасен и че нарушава основен принцип на ООП. Вашият подклас пропуска обичайната конструкция на класа, който разширява, и тъй като тази конструкция е толкова сложна (ако не беше, вие просто щяхте да я инстанциирате директно), можете да сте доста сигурни, че първоначалният процес на конструиране е важен и че някои - ако не повечето - от функционалността на този обект няма да работи правилно: хвърлете изключение, ако имате късмет, а ако имате по-малко късмет, това може да доведе до лоши резултати или дори да повреди други обекти. Дори ако този метод, от който се нуждаете, функционира правилно с този хак, възможно е бъдещи промени в този клас да направят този метод зависим от правилната конструкция и това ще развали кода ви.

Така че - използвайте на свой собствен риск!

public class MyNewClass extends ClassWithNonStaticMethod{
    public MyNewClass(){
        //Not doing proper construction
    }
}

//somewhere in your code:
new MyNewClass().nonStaticMethod();
person Idan Arye    schedule 30.10.2013
comment
Добавих го към отговора - person Idan Arye; 30.10.2013
comment
Имам достъп до getter() от ClassWithNonStaticMethod, като използвам горния код, но getter() връща null, не получавам стойности от класа ClassWithNonStaticMethod - person TMKS; 30.10.2013
comment
Имам конструктор в ClassWithNonStaticMethod, който изпълнява някои проекти - person TMKS; 30.10.2013
comment
Добавих нов конструктор по подразбиране към ClassWithNonStaticMethod, ClassWithNonStaticMethod (){}, тъй като MyNewClass() разширява това, така че ме подканва да отменя супер конструктора - person TMKS; 30.10.2013
comment
Точно за това ви предупредих - когато хакнете конструкцията на обекта, тя не е конструирана правилно и методите може да не върнат правилния резултат. Този хак е полезен само за извикване на методи, които трябваше да са статични на първо място. Тук явно не е така – няма как да правиш това, което искаш, защото това, което искаш, няма никакъв смисъл. getter е за запитване за състоянието на обект. Ако нямате обект, няма състояние за заявка. В известен смисъл null е правилният резултат - свойствата на обект, който не съществува, са нищо. - person Idan Arye; 30.10.2013
comment
Създадох един клас за съхраняване на стойностите на нестатичната променлива с помощта на getter() и setter() в моя клас, използвах HashMap за съхраняване на нестатичните стойности с някакъв уникален ключ, този HaspMap се използва за получаване на стойностите на нестатична променлива. - person TMKS; 31.10.2013

За да отговоря на въпроса ви, не, не можете. Java не е проектирана да ви позволява да правите това.

Мисля обаче, че е по-важно да попитате: Защо смятате, че трябва да направите това?

Ако нямате контрол над този клас (т.е. това е библиотечен клас) и чувствате нужда да направите това, вероятно използвате библиотеката неправилно.

Ако можете да промените класа, направете го статичен.

person J. Polfer    schedule 30.10.2013