MegaCrafter

Obsidyen Madencisi
Mesajlar
1,419
En iyi cevaplar
0
Beğeniler
1,542
Puanları
3,070
Merhaba. Bu konuda sizlere javadaki az kullanılan veya yeni başlayanların tam anlayamadığı özelliklerden bahsedeceğim. Öncelikle anahtar kelimeler ile başlayalım:
final: Bu anahtar kelime, bir değişkenin son değerini belirtmek için kullanılır. Yani değişemeyeceğini belirtmek için. Bu, API gibi bir şey yazarsanız ve metoda verilen değişkenin değişmemiş olmasını istiyorsanız işinize yarar.

static: Bu anahtar kelime orta düzey java bilgisi olan insanların bile bazen anlayamadığı bir şey. Biraz komplike bir şey aslında. Ama anlatmaya çalışıcam. Bunu 4 şekilde kullanabiliyoruz. Import, değişken, metod ve kod blokları. Kod bloklarını ayrı olarak anlatacağım için onu geçiyorum.

Static Importlar
Bu kullanımlardan en basiti importlar. Bir import'u şu şekilde yazabilirsiniz:
Kod:
import static java.lang.Math;
Biliyorsunuz ki Math class'ında Math.sqrt(); gibi metodlar çağırabiliyoruz. Ama eğer başına her seferinde Math koymak istemezsek import'u static yaparız. Yani:
Kod:
import java.lang.Math;
int i = Math.sqrt(2);

import static java.lang.Math.*;
int i = sqrt(2); // Gördüğünüz gibi burada Math yazmamıza gerek kalmadı.
// Meraklısına not: Bu özellik C dillerindeki namespace'in aynısı
Ayrıca sakın unutmayın. Static import yapınca sonuna ".*" koymalısınız. Bu, class içindeki her şeyin bu import'a dahil olduğunu gösterir.

Static Metodlar
Metodların static olup olmaması, o metodun bir kategori metodu mu yoksa nesne metodu mu olduğunu gösterir. Yine Math class'ını örnek alalım. Math class'ında bir metodu çağırmak için onu tanımlamanız gerekmez. Yani:
Kod:
Math math = new Math(); // Bu tanım mümkün değildir zaten. Biz sadece örnek amaçlı yapıyoruz.
int i = math.sqrt(2); // Bunu yapamazsınız. Çünkü sqrt() metodu static'tir ve static metodlar nesne ile çağırılamaz.
Kategori metodundan kastım şu: Mesela matematik ile ilgili metodlar bir class'a, fizik ile ilgili metodlar bir class'a ayrılıyor ise static olabilirler. Ama dikkat edin. Static metodlar içerisine static olmayan değişkenler yazılamaz. Değişkenleri de anlattıktan sonra detaylandıracağız.

Static Değişkenler
Değişkenler için de metodlardaki kuralın aynısı var. Ancak bir özelliği daha var. Static olan değişkenlerin tanımı başka bir class'ta değişirse değişkenin sahibi olan class için de değişir. Çünkü bu değişkenler kategorisel değişkenlerdir. Yukarıda dediğimiz gibi, static değişkenleri çağırmak için yeni bir nesne oluşturmak gerekmez. Direk class'a olan erişiminiz ile değer atarsınız. Yani:
Kod:
class A {
    static int sayi1 = 0;
    int sayi2 = 0;
}

class B {
    A.sayi1 = 1;
    A a = new A();
    a.sayi2 = 1;
}

class C {
    int i1 = A.sayi1; // B class'ında atadığımız 1 değeri geçerli olacak.
    A a = new A();
    int i2 = a.sayi2; // A class'ında tanımlanmış olan 0 değeri geçerli olacak.
}
Çünkü "new A();" demek, o class'ı baştan oluşturmaktır. Yani a.sayi2 değeri, B'de değiştirilmiş değere eşit değildir. Yani bir değişkeni static yapmak, onu global yapmak ile aynıdır. Eğer gamemaker tarzı programlar ile uğraştıysanız orada da bunu duymuşsunuzdur. İşlevi aynı.

Static metodların sadece static değişken alabilmesi
Şimdi neden static metodların static olmayan değişkenleri alamadığını anlatayım. Dediğimiz gibi static metodların çağırılması için yeni bir nesne oluşturmak gerekmez. Ama static olmayan değişkenler için gerekir. Biz yeni bir nesne oluşturmadan bir static metod çağırırsak ve içinde static olmayan değişken olursa ne olur peki? Yeni bir nesne oluşturmak gerekir. Ama static için gerekmiyor. O yüzden çakışma oluyor. Bunu engellemek için java böyle bir kural koymuş. Sağolsun :D

Kod Blokları
Kod bloklarına geçebiliriz artık. Bu çok az kullanılan bir şey. Ama işlevi büyük. Bazı durumlarda hayat kurtarıyor. Mesela bir olay düşünelim. Siz bir program yapmak istiyorsunuz. Bir array oluşturdunuz. Bu array'i tanımladığınız gibi içinin 0'dan 100'e kadar sayılarla doldurulmasını istiyorsunuz. İşte kod blokları burada işinize yarar. Bir değişkeni tek bir şekilde değil birkaç metodla tanımlamanız gerekiyorsa lazım olur. Kullanımı şu şekilde:
Kod:
class Bisey {
    int[] dizi;
    { // Kod bloğumuzu açtık
        dizi = new int[100];
        for (int i = 0; i < 100; ++i) {
            dizi = i;
        }
    } // Kod bloğumuzu kapattık

}

Bu kod blokları, sanki değişken tanımıymış gibi program ilk çalıştığında çalışır. Aslında bu haliyle bir işe yaramaz. Çünkü constructor kullanabilirsiniz. Nasıl olsa bu değişkene erişmek için constructor kullanmak zorudayız. Ama ya değişken static olsaydı? O halde constructor kullanılmayacaktı. Bu yüzden kod bloğu kullanabiliriz. Ama dikkat edin. Aynı metodlarda olduğu gibi static kod bloklarında sadece static değişkenler kullanabilirsiniz. Anladıysanız geçelim.

Bir başka güzel özellik ise array'lerin yazım biçiminin değişebilmesi. Bu sadece metodlarda olabiliyor. Ama işe yarıyor. Mesela:
Kod:
public int rastgele(int... sayılar) { // Bu demektir ki, buraya istediğiniz kadar int yazabilirsiniz.
    // olaylar
}

rastgele(5, 10, 20, 2, 30, 15, 13); // Sonsuza kadar buraya böyle sayı yazabiliyoruz.
Bu aynı zamanda bir array'dir. Yani siz o metodun içinde sayıları kullanmak isterseniz array olarak döner. İşimiz kısaltıyor bunu yapmak. Çünkü:
Kod:
// Eğer o olmasaydı şu şekilde yapmamız gerekirdi:
int[] sayılar = {10, 10, 20, 2, 30, 15}
rastgele(sayılar);

Switch-case
Switch-case denilen özelliğin az kullanıldığını görüyorum. Aslında çok yardımcı bir şey. Ama insanların aklına gelmiyor nedense. Karşılaştırma yaparsak:
Kod:
int seçim = // Kısaca kullanıcının seçeceği bir şey olacak. Uzun olmasın diye yazmadım.
if (seçim == 0) {
    // Olaylar
}
if (seçim == 1) {
    // Olaylar
}
if (seçim == 2) {
    // Olaylar
} else {
    // Olaylar
}

// Şimdi ise switch-case kullanalım.
switch (seçim) {
    case 0:
        // Olaylar
    case 1:
        // Olaylar
    case 2:
        // Olaylar
    default:
        // Olaylar
}
Ayrıca oradaki "default" else ile aynı anlama geliyor. Önceki hiçbir olay gerçekleşmemişse anlamındadır yani. Sayı olduğu için fazla değişiklik yapmadı. Ama daha büyük şeyler olunca eliniz her seferinde if yazmaktan yorulacaktır.

If-Else'i kısaltma
Son olarak da return için bir güzelliğimiz var. Bu şey kodumuzu baya kısaltıyor. Şöyle göstereyim:
Kod:
// Normalde
if (sayı == 5) {
    return sayı;
} else {
    return 0;
}

// Bu güzellik ile
return (sayı == 5) ? sayı : 0;
(sayı == 5) bölümü sizin şart bölümünüz. Doğru veya yanlış döndürmek zorundadır. "? sayı" yeri, eğer doğru ise dönecek şeydir. ": 0" da yanlış ise dönecek yerdir. Tabii ki bu sadece return için kullanılmıyor. Konu daha da uzamasın diye yazmıyorum gerisini.

Umarım yardımcı olmuştur. Aslında biraz daha yazacaktım. Ama uzun olduğu için yazmadım. Eğer bir hatam varsa lütfen düzeltin :)
 


GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,790
import şeysini yeni gördüm lel
Neyse hoj olmuş güzel olmuş*
ve büyük ihtimalle en çok kullanılacak static methodlara kısaltıcı not*
static methodlar her nesne için aynı değeri, değişkeni alan ve sonucu veren metodlardır*
Örneğin
Insan a1 = new Insan(InsanCinsi.ERKEK);
Insan a2 = new Insan(InsanCinsi.DISI);
static bir method olarak patates'i hayal edin*
ve static olmayan bir method olarak patlican'ı hayal edin*
(a1.patates'i kullanamazsınız aslında*)
a1.patates ile a2.patates'in sonuçları aynı verir*
ama a1.patlican ile a2.patlican'ın sonuçları aynı gelmez (tabi değişkenler sorgular döndürücü şeyler farklıysa orayı hayal edeceksiniz işte .s)*
Daha fazla not*
Çok kısa oldu di mi :(
 
Son düzenleme:

RedFail

Elmas Madencisi
Mesajlar
739
En iyi cevaplar
0
Beğeniler
473
Puanları
1,090
Hmm. Güzel olmuş ileride bana yardımı dokunabilir.

Sen şu hackleri önlemek için yapılan bir sistemi yapmaya çalışan java cı değil misin :D !


Teşekkürler çok yardımcı oldu. :)
Heeey! Benim "Skripter, Real Skripter." şeyime özenmişsin >:I
 

MhaWTHoR

Obsidyen Madencisi
Mesajlar
1,208
En iyi cevaplar
1
Beğeniler
1,161
Puanları
3,230
Hmm. Güzel olmuş ileride bana yardımı dokunabilir.

Sen şu hackleri önlemek için yapılan bir sistemi yapmaya çalışan java cı değil misin :D !


Heeey! Benim "Skripter, Real Skripter." şeyime özenmişsin >:I
Alakası yok lütfen.
Eskiden kalma, xx, sadece xx tarzı bir akım vardı o zamanlar. @TrustNoONE
Bende böyle yaptım.
 

MegaCrafter

Obsidyen Madencisi
Mesajlar
1,419
En iyi cevaplar
0
Beğeniler
1,542
Puanları
3,070
Hmm. Güzel olmuş ileride bana yardımı dokunabilir.

Sen şu hackleri önlemek için yapılan bir sistemi yapmaya çalışan java cı değil misin :D !


Heeey! Benim "Skripter, Real Skripter." şeyime özenmişsin >:I
Beni her yerde görebilirsin. Teknoloji çok ilerledi artık :D

import şeysini yeni gördüm lel
Neyse hoj olmuş güzel olmuş*
ve büyük ihtimalle en çok kullanılacak static methodlara kısaltıcı not*
static methodlar her nesne için aynı değeri, değişkeni alan ve sonucu veren metodlardır*
Örneğin
Insan a1 = new Insan(InsanCinsi.ERKEK);
Insan a2 = new Insan(InsanCinsi.DISI);
static bir method olarak patates'i hayal edin*
ve static olmayan bir method olarak patlican'ı hayal edin*
(a1.patates'i kullanamazsınız aslında*)
a1.patates ile a2.patates'in sonuçları aynı verir*
ama a1.patlican ile a2.patlican'ın sonuçları aynı gelmez (tabi değişkenler sorgular döndürücü şeyler farklıysa orayı hayal edeceksiniz işte .s)*
Daha fazla not*
Çok kısa oldu di mi :(
Normalde ben de o kadar uzun geçmezdim. Ama o kategori ve nesne özelliğini tam anlatabilmek istemiştim. İnsanlar sadece gerekiyorsa static kullanıyor diye yani.
 

Minecraftplayerr

Java, Skript, Php, Html, Css, Javascript, Anime
Mesajlar
3,980
En iyi cevaplar
6
Beğeniler
3,788
Puanları
7,080
Ruh hali
Kod blokları kısmında bulunan kod yerine şu kod daha uygun olmaz mı?
PHP:
int i=1;
while(i<=100){
    konsol.sendMessage(""+i);
    i++;
}
Yoksa olayı yanlış mı anladım .s
 

MegaCrafter

Obsidyen Madencisi
Mesajlar
1,419
En iyi cevaplar
0
Beğeniler
1,542
Puanları
3,070
Kod blokları kısmında bulunan kod yerine şu kod daha uygun olmaz mı?
PHP:
int i=1;
while(i<=100){
    konsol.sendMessage(""+i);
    i++;
}
Yoksa olayı yanlış mı anladım .s
Hayır konsola yazı yazmadık orda. Dizi değişkenini 0'dan 100'e kadar olan sayılarla doldurduk :D Tabi öyle bile olsaydı ben while kullanmazdım.
 

Üst