Object , Class , Static keyword , Memory

Tutaq ki, ashagidaki formada bir class yaratmishiq :

public class User {
    public String name; 
    public String username; 
    public int age; 
    public static String test;     
    public void foo(){}
    public static void foo2(){}
} 
application u run etdikde, javac .java fayllarini compile edib .class bytecodelarini yaratdiqdan sonra java, yeni JVM ishe dushur. Yalniz ehtiyaci oldugu classlari yaddasha yukleyir. Meselen, main methodunda, User classinin static metodunu cagiraq, bu zaman class load olunacaq ve ya class a ehtiyac duyulan diger hallarda. Eger kod hemin class a ehtiyac duymasa, bu class yaddasha yuklenmir.  
JVM yaddash da yer ayiran vaxti static acar sozu olanlari da class terkibinde saxladir. Yeni yaddash da onlar uchun de ayrica yer ayirir.
Static - yeni stabil kimi de basha dushule biler.

Bu classi i istifade etmek isteyende, yeni User. yazib classin icinde olan deyishen ve metodlara chatmaq isteyende yalniz static olanlar gorsenecek.

User.test = "test text"; // static deyisen 
User.foo2(); // static method

User.test = "test text"; yazmaqla yaddashda olan User class nin daxilinde olan static test deyishenine "test text" string menimsedildi. Artiq istenilen yerde bu class daxilindeki static deyisheni cagirdiqda, hemin deyer gorsenecek.

User classindan obyekt yaratmaq uchun , ashagidaki kimi yazmaq lazimdir :
User u = new User();

Burada User classinda static olmayan her bir deyishen ve metod uchun yaddash da yer ayrilir. Yeni User obyekti yaranir ve bu User obyektine u deyisheni nezaret edir.
Evvelki halin eksi olaraq u. yazdiqda , static olmayan her bir deyishen ve metoda chatmaq mumkundur.
Tutaq ki,

User u = new User(); 
u.name="Hamid"; 
u.username="hamidsultanzadeh"; 
u.age=19;

Bu deyerler yalniz u deyishenine aid deyerlerdir. Yeni,

User u2 = new User();

kimi bir deyishen yaratsaq , yuxarda verdiyimiz deyerler bu deyishene aid olmaycaq.
Yeni her bir obyekt yaradan zaman , yaddash da ayri yer yaranir. Eynile muxtelif deyishenler yaradib isheltdiyimiz kimi.
Classla obyekt arasinda esas ferq bundadir ki , class yalniz bir defe yaranir obyekti ise istenilen qeder yaratmaq olar.

baeldung - class loader

QEYD:
  1. main metodunda static (psvm) keyword mutleq olmalidir. Chunki , ilk once JVM ishleyen vaxt, ehtiyac olan class lar uchun yaddash da yer ayrilir ve bununla yanashi static deyishen ve metodlar uchun de yer ayrilir. Eger main metodu static olmasa idi, yalniz obyekt yaranan zaman main metodu yaranardi. Bildiyimiz kimi Java-nin start noqtesi main metodudur. Eger main olmasi uchun obyekt lazimdirsa ve obyektin yaranmasi uchun main metodu lazimdirsa, bu zaman burda anlashilmazliq yaranir :D. Bu sebebden main metodu static keyword la ishleyir
  2. static olan bir metod, her hansi bir obyektin deyishen ve ya metodunu cagira bilmez. Buna sebeb JVM in ishleme prinsipini gostermek olar. Bayaq dediyimiz kimi JVM ilk once ehtiyac olan classlar uchun yer ayirir. Static keyword lar ise bu classlarin daxilinde birlikde yaranir. Obyekt yaranmasi artiq runtime zamani bash verir. Static metodlar yaranan vaxti hele ki hech bir obyekt yaranmir. Bu da static metodlarin obyektleri ve onlarin deyishen ve metodlarini gormemesine sebebdir.
    Lakin bele bir istisna hal var ki, meselen:

    public class Main {
       public static User us = new User();
    
       public static void main(String[] args){
           /* some code */
       }
    }

    Bu zaman yaradilan User obyekti static oldugundan Main classi ile birlikde yaddash da yer tutur. Yeni obyekt runtime zamani yaranmir. Bu sebebden bu obyektin deyishen ve metodlarina istenilen static ve ya static olmayan metoddan chatmaq mumkundur.
  3. Tutaq ki, User class indan obyekt yaradib onu funksiyaya gonderirik. Obyekt yaradan zaman, onun reference -i , yeni unvani yaratdigimiz deyishene menimsedilir. Bu deyisheni funksiyaya gonderdikde, eslinde hemin unvani funksiyaya gonderirik.
    Asagidaki prosesden sonra us - un name deyisheninin deyeri "Hamid" olaraq deyishecekdir.
    Bu array - lere de aiddir. Eynile obyekt prinsipi ile ishleyir.

    public class Main {
    
       public static void main(String[] args){
           User us = new User();
           us.name = "hhhhh";
           change(us); 
       }
       
       public static void change(User us){
           us.name = "Hamid";
       } 
    }

    Java pass-by-value prinsipi ile ishleyir. Bu da o demekdir ki, biz funksiyaya

    int number = 12;

    deyishenini gondersek, sadece funksiyaya geden deyer 12 olacaq.


Comments

Popular posts from this blog

Validation for AZ phone numbers with RegEx in Java

Java necə işləyir, kod nədir ?

@Transactional annotation haqqinda. Cascade istifade olunmasi