Javastatic ile finalanahtar kelimeler arasında hep kafam karıştı .
Nasıl farklılar?
Javastatic ile finalanahtar kelimeler arasında hep kafam karıştı .
Nasıl farklılar?
Yanıtlar:
Önce statik değişkenlere ve statik yöntemlere bakalım.
Class.variableClass.methodName() thisveya superanahtar kelimeleri kullanamaz .Java'nın ayrıca "statik iç içe sınıfları" vardır. Statik iç içe sınıf, dış sınıfın bir örneğine dolaylı olarak başvurusu olmayan bir sınıftır.
Statik iç içe sınıfların örnek yöntemleri ve statik yöntemleri olabilir.
Java'da üst düzey statik sınıf diye bir şey yoktur.
ana yöntem,
staticherhangi bir somutlaşma gerçekleşmeden önce bir uygulamanın çalıştırılabilmesi gerektiğidir.
final anahtar kelime, daha sonra değiştirilemeyen bir varlığı tanımlamak için birkaç farklı bağlamda kullanılır.Bir finalsınıf alt sınıflara ayrılamaz. Bu, güvenlik ve verimlilik nedeniyle yapılır. Buna göre, Java standart kütüphane sınıflarının çoğu final, örneğin java.lang.Systemve şeklindedir java.lang.String. Bir finalsınıftaki tüm yöntemler dolaylı olarak final.
Bir finalyöntem, alt sınıflar tarafından geçersiz kılınamaz. Bu, sınıfın işlevi veya tutarlılığı için önemli olabilecek bir yöntemi değiştiren bir alt sınıftan beklenmedik davranışları önlemek için kullanılır.
Bir finaldeğişken, bir başlatıcı veya atama ifadesi aracılığıyla yalnızca bir kez başlatılabilir. Beyan noktasında başlatılması gerekmez: buna blank finaldeğişken denir . Bir sınıfın boş bir son örnek değişkeni, bildirildiği sınıfın her kurucusunun sonuna kesinlikle atanmalıdır; benzer şekilde, boş bir nihai statik değişken, bildirildiği sınıfın statik bir başlatıcısına kesinlikle atanmalıdır; aksi durumda, her iki durumda da bir derleme zamanı hatası oluşur.
Bir yöntem gövdesi içinde anonim bir iç sınıf tanımlandığında final, bu yöntem kapsamında bildirilen tüm değişkenlere iç sınıf içinden erişilebilir. Atandıktan sonra, son değişkenin değeri değişemez.
Class.methodName()
statik , bir örneğe değil sınıfa ait olduğu anlamına gelir; bu, söz konusu değişkenin / yöntemin belirli bir Sınıfın tüm örnekleri arasında paylaşılan yalnızca bir kopyası olduğu anlamına gelir .
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
final tamamen ilgisizdir, sadece bir kez başlatmayı tanımlamanın bir yoludur. Değişkeni tanımlarken veya yapıcı içinde başka hiçbir yerde başlatamazsınız.
note Not Son yöntemlere ve son sınıflara ilişkin bir not, bu yöntem veya sınıfın sırasıyla geçersiz kılınamayacağını / genişletilemeyeceğini açıkça belirtmenin bir yoludur.
Ekstra Okuma Statik konusunda, sahip olabileceği diğer kullanımlardan bahsediyorduk, bazen statik bloklarda kullanılır. Statik değişkenleri kullanırken bazen sınıfı kullanmadan önce bu değişkenleri ayarlamak gerekir, ancak ne yazık ki bir kurucu almıyorsunuz. Burada statik anahtar kelime devreye girer.
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
Bunu, örnek başına yapıcıdan önce çağrılan örnek başlatıcı bloklarıyla karıştırmamalısınız .
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
İkisi gerçekten birbirine benzemiyor. staticalanlar, herhangi bir sınıfın belirli bir örneğine ait olmayan alanlardır .
class C {
public static int n = 42;
}
Burada, staticalan nbelirli bir örneğiyle Cdeğil, genel olarak tüm sınıfla ilişkilidir (bu yüzden C.nona erişmek için kullanılabilir). Hala bir örneğini kullanabilir miyim Cerişmek için n? Evet - ama özellikle iyi bir uygulama olarak görülmüyor.
final diğer yandan, belirli bir değişkenin başlatıldıktan sonra değişemeyeceğini gösterir.
class C {
public final int n = 42;
}
Burada nolduğu için yeniden atanamaz final. Diğer bir fark, finalher değişkenin statik olarak bildirilememesine rağmen, herhangi bir değişkenin bildirilebilmesidir.
Ayrıca, finalgenişletilemediklerini gösteren sınıflar da bildirilebilir :
final class C {}
class B extends C {} // error!
Benzer şekilde, yöntemler, genişleyen bir sınıf tarafından geçersiz kılınamayacaklarını göstermek için son olarak bildirilebilir :
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
publicdosyayı tanımlayan potansiyel sınıf) veya staticiç sınıflar staticdeğişkenleri tanımlayabilir . Diğer iç sınıflar dış sınıfın örnekleridir ve statik değişkenleri olamaz.
final -
1) Bir değişkene " son " anahtar kelimesini uyguladığımızda , bu değişkenin değeri sabit kalır. (veya) Bir değişkeni nihai olarak ilan ettikten sonra , bu değişkenin değeri değiştirilemez.
2) Bir değişkenin Bir programın ömrü boyunca değerin değişmemesi
statik -
1) bir değişkene " statik " anahtar kelimesini uyguladığımızda , bu anahtar kelime sınıfa ait olduğu anlamına gelir.
2) Bir yönteme " statik " anahtar kelime uyguladığımızda , yönteme sınıfın herhangi bir örneği oluşturulmadan erişilebileceği anlamına gelir
static sınıftaki tüm örnekler tarafından paylaşılan bellekteki değişkenin yalnızca bir kopyası olduğu anlamına gelir.
finalAnahtar kelime sadece değer değiştirilemez anlamına gelir. Olmadan final, herhangi bir nesne değişkenin değerini değiştirebilir.
Statik ve final bazı büyük farklılıklara sahiptir:
Statik değişkenler veya sınıflar her zaman (hemen hemen) her yerden kullanılabilir olacaktır. Final, yalnızca bir değişkenin değiştirilemeyeceği anlamına gelen bir anahtar kelimedir. Öyleyse:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
Program, hataya neden olacak "ilk" tamsayıyı değiştirmeye çalışana kadar çalışır. Bu sınıfın dışında, yalnızca "ilk" değişkene erişiminiz olur. Bu, her zaman kullanılabilen "saniye" nin aksine.
Bir nesneyi Hoparlör gibi düşünün. Konuşmacı bir sınıfsa, ses seviyesi, tiz, bas, renk vb. Gibi farklı değişkenlere sahip olacaktır. Hoparlör sınıfını tanımlarken tüm bu alanları tanımlarsınız. Örneğin, renk alanını statik bir değiştiriciyle bildirdiniz, yani derleyiciye, sınıfın kaç kez başlatıldığına bakılmaksızın, bu değişkenin tam olarak bir kopyası olduğunu söylüyorsunuz.
bildirilmesi
static final String color = "Black";
bu sınıf her başlatıldığında, renk alanı değerinin değiştirilmediği sürece "Siyah" olmasını sağlar.
public class Speaker {
static String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //will provide output as "Black"
Speaker.color = "white";
System.out.println(Speaker.color); //will provide output as "White"
}}
Not: Şimdi hoparlörün rengini nihai olarak değiştirdiğinizde, bu kod çalışmaz, çünkü son anahtar kelime alanın değerinin asla değişmemesini sağlar.
public class Speaker {
static final String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //should provide output as "Black"
Speaker.color = "white"; //Error because the value of color is fixed.
System.out.println(Speaker.color); //Code won't execute.
}}
Bu kodu doğrudan taklitçinize kopyalayıp yapıştırabilir ve deneyebilirsiniz.
Kolay Fark,
final : değişkenin Değerinin Son olduğu ve hiçbir yerde değişmeyeceği anlamına gelir. Son x = 5 olduğunu söylerseniz, x değiştirilemez anlamına gelir, değeri herkes için sondur.
Statik: yalnızca bir nesnesi olduğu anlamına gelir. diyelim ki x = 5'iniz var, hafızada x = 5 ve bir sınıfın içinde var. sınıfın bir nesnesini veya örneğini oluşturursanız, bu sınıfı ve değişkenlerini ve yöntemlerini temsil eden belirli bir kutu anlamına gelir. ve bu sınıfın başka bir nesnesini veya örneğini oluşturursanız, aynı sınıfta, içinde farklı x bulunan iki kutu olduğu anlamına gelir. ve her iki x'i farklı konumlarda çağırır ve değerlerini değiştirirseniz, değerleri farklı olur. kutu 1'de x = 5 olan ve kutu 2'de x = 6 vardır. ancak x'i statik yaparsanız, tekrar oluşturulamayacağı anlamına gelir. sınıf nesnesi oluşturabilirsiniz, ancak bu nesnenin içinde farklı x bulunmaz. x statik ise, kutu 1 ve kutu 2'nin her ikisi de 5 değerine sahip aynı x değerine sahip olacaktır. Evet statik olmayan herhangi bir yerde nihai değil olarak değiştirebilirsiniz. kutu 1 x varsa ve ben değerini x = 5 olarak değiştirir ve bundan sonra box2 olan başka bir kutu yapmak ve box2 x değerini x = 6 olarak değiştirirseniz. sonra X statik olduğundan her iki kutu da aynı x değerine sahiptir. ve her iki kutu da kutu değerini 6 olarak verecektir, çünkü kutu2 5 ila 6 değerinin üzerine yazar.
Hem nihai hem de statik tamamen farklıdır. Nihai olan final değiştirilemez. statik olarak kalır ancak değiştirilebilir.
Msgstr "Bu bir örnektir. Statik değişkenin her zaman sınıf adıyla çağrıldığını unutmayın. Çünkü bu sınıfın tüm nesneleri için yalnızca bir tanesidir. Sınıf A x = 5'e sahiptir, bunu Ax = 6 ile arayabilir ve değiştirebilirim; "
Statik, sınıftaki herhangi bir nesnenin çağırabileceği, doğası gereği bir nesne türüne ait olan bir şeydir.
Değişken tüm sınıf için son olabilir ve bu artık değiştirilemeyeceği anlamına gelir. Yalnızca bir kez ayarlanabilir ve tekrar ayarlanmaya çalışmak bir hataya neden olur. Belki de değiştirilemeyen bir sabit ilan etmek istiyorsanız, bir dizi nedenden dolayı faydalıdır.
Bazı örnek kodlar:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
Wikipedia, java anahtar kelimelerinin tam listesini içerir .
Burada tam bir cevap vermeye çalışmam. Benim tavsiyem, her birinin ne yaptığını anlamaya odaklanmak olacak ve daha sonra etkilerinin tamamen farklı olduğunu ve neden bazen birlikte kullanıldığını görmek açık olmalı.
staticbir sınıfın üyeleri (öznitelikler ve yöntemler) içindir ve örnek (statik olmayan) üyelerin aksine anlaşılmalıdır. Java Dersleri'nde "Örneği ve Sınıf Üyelerini Anlamak" ı okumanızı tavsiye ederim . Ayrıca staticbloklar halinde de kullanılabilirim ama bir başlangıç için endişelenmezdim.
finaldeğişkenlere, yöntemlere, sınıflara veya diğer bazı durumlara uygulanmasına göre farklı anlamları vardır. Burada Wikipedia açıklamalarını daha çok seviyorum .
Statik değişken değerleri, değişkenin bir kopyasının uygulama içinden geçmesine rağmen değiştirilebilirken, Nihai Değişken değerleri bir kez başlatılabilir ve uygulama boyunca değiştirilemez.