Statik ve final arasındaki fark?


174

Javastatic ile finalanahtar kelimeler arasında hep kafam karıştı .

Nasıl farklılar?

Yanıtlar:


238

Statik anahtar kelime 4 senaryoda kullanılabilir

  • statik değişkenler
  • statik yöntemler
  • statik kod blokları
  • statik iç içe sınıf

Önce statik değişkenlere ve statik yöntemlere bakalım.

Statik değişken

  • Nesneye (örnek) değil sınıfa ait bir değişkendir.
  • Statik değişkenler, yürütmenin başlangıcında yalnızca bir kez başlatılır. Bu değişkenler önce herhangi bir örnek değişkeninin başlatılmasından önce başlatılır.
  • Sınıfın tüm örnekleri tarafından paylaşılacak tek bir kopya.
  • Statik bir değişkene doğrudan sınıf adıyla erişilebilir ve herhangi bir nesneye ihtiyaç duymaz.
  • Sözdizimi: Class.variable

Statik yöntemi

  • Nesneye (örneğe) değil sınıfa ait bir yöntemdir.
  • Statik bir yöntem yalnızca statik verilere erişebilir. Sınıfın bir örneğini oluşturmadığı / oluşturmadığı sürece statik olmayan verilere (örnek değişkenleri) erişemez.
  • Statik yöntem yalnızca diğer statik yöntemleri çağırabilir ve sınıfın bir örneğini oluşturmadığı / oluşturmadığı sürece statik olmayan bir yöntemi çağıramaz.
  • Statik bir yönteme doğrudan sınıf adıyla erişilebilir ve herhangi bir nesneye ihtiyaç duymaz.
  • Sözdizimi: Class.methodName()
  • Statik bir yöntem hiçbir şekilde başvuru yapamaz thisveya superanahtar kelimeleri kullanamaz .

Statik sınıf

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.

Kenar notu:

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.

Not: Değişken bir referanssa, bu değişkenin başka bir nesneye başvurmak için yeniden bağlanamayacağı anlamına gelir. Ancak referansta bulunduğu nesne, orijinal olarak değiştirilebilir olsaydı, hala değiştirilebilir.

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.


5
(Seni küçümsemedim) Bazı açıklamalar: "Statik yöntem yalnızca statik verilere erişebilir. Statik olmayan verilere erişemez (örnek değişkenler)" - Sınıfın bir örneğini OLUŞTURUR / OLUŞTURUR. "Statik bir yöntem yalnızca diğer statik yöntemleri çağırabilir ve statik olmayan bir yöntemi çağıramaz." - Sınıfın bir örneğini OLUŞTURDUĞUNU OLUŞTURUN.
xagyg

1
statik yöntem sözdizimi açıklama yanlış söz düşünüyorum. olabilirClass.methodName()
Mdhar9e

statik sınıfa da sahip olabiliriz. Cevabınızda düzeltme yapın. Teşekkürler :)
Madhusudan

Java 8'den itibaren anonim bir sınıf (ve lambda), son değişkenlere etkili bir şekilde erişebilir ve son anahtar kelimenin kısıtlaması yoktur.
akhil_mittal

38

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.
Sağladığınız

2
Her şey olması gerektiği gibi basit ve açık. Kabul edilen cevap sadece .... ayrıntılıdır.

22

İ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!
}

Girişler için teşekkürler. Kod hata veriyor: C sınıfı {public static int n = 42; } alanın statik olmayan türde statik bildiremeyeceğini söylüyor. Neden Cn beyan edemiyorum veya yapamıyorum?
TechnoCorner

@TechnoCorner yalnızca üst düzey sınıflar ( 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.
zapl

17

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


12

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.


3

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.


3

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.


2

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; "


1

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 .


Belirli bir nesne için ne demek istiyorsun? Lütfen açıklar mısınız?
TechnoCorner

0

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 .


-1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.