Perbedaan antara Statis dan final?


174

Saya selalu bingung antara staticdan finalkata kunci di java .

Bagaimana mereka berbeda ?

Jawaban:


238

Kata kunci statis dapat digunakan dalam 4 skenario

  • variabel statis
  • metode statis
  • blok kode statis
  • kelas bersarang statis

Mari kita lihat variabel statis dan metode statis terlebih dahulu.

Variabel statis

  • Ini adalah variabel yang milik kelas dan bukan objek (contoh).
  • Variabel statis diinisialisasi hanya sekali, pada awal eksekusi. Variabel-variabel ini akan diinisialisasi terlebih dahulu, sebelum inisialisasi variabel instan apa pun.
  • Satu salinan untuk dibagikan oleh semua instance kelas.
  • Variabel statis dapat diakses langsung dengan nama kelas dan tidak memerlukan objek apa pun.
  • Sintaksis: Class.variable

Metode statis

  • Ini adalah metode yang milik kelas dan bukan milik objek (contoh).
  • Metode statis hanya dapat mengakses data statis. Itu tidak dapat mengakses data non-statis (variabel instan) kecuali ia memiliki / membuat turunan dari kelas.
  • Metode statis hanya dapat memanggil metode statis lainnya dan tidak dapat memanggil metode non-statis dari itu kecuali ia memiliki / membuat turunan dari kelas.
  • Metode statis dapat diakses langsung dengan nama kelas dan tidak memerlukan objek apa pun.
  • Sintaksis: Class.methodName()
  • Metode statis tidak dapat merujuk thisatau superkata kunci dengan cara apa pun.

Kelas statis

Java juga memiliki "kelas bersarang statis". Kelas bersarang statis hanyalah salah satu yang tidak secara implisit memiliki referensi ke turunan dari kelas luar.

Kelas bersarang statis dapat memiliki metode instan dan metode statis.

Tidak ada yang namanya kelas statis tingkat atas di Jawa.

Catatan:

Metode utama adalah statickarena itu harus dapat diakses untuk menjalankan aplikasi sebelum instantiasi terjadi.

final kata kunci digunakan dalam beberapa konteks berbeda untuk menentukan entitas yang nantinya tidak dapat diubah.

  • Sebuah finalkelas tidak dapat subclassed. Ini dilakukan untuk alasan keamanan dan efisiensi. Oleh karena itu, banyak kelas perpustakaan standar Java final, misalnya java.lang.Systemdan java.lang.String. Semua metode dalam finalkelas secara implisit final.

  • Sebuah finalmetode tidak dapat ditimpa oleh subclass. Ini digunakan untuk mencegah perilaku tak terduga dari subkelas mengubah metode yang mungkin penting untuk fungsi atau konsistensi kelas.

  • Sebuah finalvariabel hanya dapat diinisialisasi sekali, baik melalui initializer atau pernyataan penugasan. Itu tidak perlu diinisialisasi pada titik pernyataan: ini disebut blank finalvariabel. Variabel instance akhir kosong dari sebuah kelas harus ditentukan di akhir setiap konstruktor dari kelas yang dideklarasikan; sama halnya, variabel statis akhir kosong harus secara pasti ditetapkan dalam initializer statis dari kelas yang dideklarasikan; jika tidak, kesalahan waktu kompilasi terjadi dalam kedua kasus.

Catatan: Jika variabel adalah referensi, ini berarti bahwa variabel tidak dapat terikat kembali untuk referensi objek lain. Tetapi objek yang direferensikan masih bisa berubah, jika awalnya bisa berubah.

Ketika kelas dalam anonim didefinisikan dalam tubuh metode, semua variabel yang dideklarasikan finaldalam lingkup metode tersebut dapat diakses dari dalam kelas batin. Setelah ditetapkan, nilai variabel akhir tidak dapat berubah.


5
(Saya tidak menurunkan suara Anda) Beberapa klarifikasi lebih lanjut: "Metode statis hanya dapat mengakses data statis. Tidak dapat mengakses data non-statis (variabel instan)" - KECUALI itu memiliki / membuat turunan dari kelas. "Metode statis hanya dapat memanggil metode statis lainnya dan tidak dapat memanggil metode non-statis darinya." - KECUALI memiliki / membuat instance kelas.
xagyg

1
dalam metode Sintaks penjelasan sintaks yang Anda sebutkan salah saya pikir. bisa jadiClass.methodName()
Mdhar9e

kita dapat memiliki kelas statis juga. Koreksi jawaban Anda. Terima kasih :)
Madhusudan

Pada Java 8, kelas anonim (dan lambda) dapat mengakses variabel akhir secara efektif dan tidak ada batasan kata kunci akhir.
akhil_mittal

38

statis berarti kelas itu bukan milik kelas, ini berarti bahwa hanya ada satu salinan variabel / metode yang dibagi antara semua instance Kelas tertentu .

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 sama sekali tidak berhubungan, itu adalah cara untuk mendefinisikan inisialisasi hanya sekali. Anda dapat menginisialisasi ketika mendefinisikan variabel atau di dalam konstruktor, di tempat lain.

note Catatan tentang metode final dan kelas akhir, ini adalah cara yang secara eksplisit menyatakan bahwa metode atau kelas tidak dapat ditimpa / diperluas masing-masing.

Bacaan Ekstra Jadi pada topik statis, kami berbicara tentang kegunaan lain yang dimilikinya, terkadang digunakan dalam blok statis. Saat menggunakan variabel statis, kadang-kadang perlu untuk mengatur variabel-variabel ini sebelum menggunakan kelas, tetapi sayangnya Anda tidak mendapatkan konstruktor. Di sinilah kata kunci statis masuk.

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

Anda tidak boleh bingung dengan blok inisialisasi instance yang dipanggil sebelum konstruktor per instance.


Input berikut yang Anda berikan dapat menghapus semua kebingungan, terima kasih ...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.
prashant thakre

2
Sederhana dan jelas. Jawaban yang diterima hanya .... verbose.

22

Keduanya benar-benar tidak mirip. staticbidang adalah bidang yang bukan milik instance kelas tertentu .

class C {
    public static int n = 42;
}

Di sini, staticbidang ntidak terkait dengan instance khusus apa pun Cselain dengan seluruh kelas secara umum (itulah sebabnya C.ndapat digunakan untuk mengaksesnya). Masih bisakah Anda menggunakan instance Cuntuk mengakses n? Ya - tetapi itu tidak dianggap praktik yang sangat baik.

final di sisi lain menunjukkan bahwa variabel tertentu tidak dapat berubah setelah diinisialisasi.

class C {
    public final int n = 42;
}

Di sini, ntidak dapat ditugaskan kembali karena memang demikian final. Satu perbedaan lainnya adalah bahwa variabel apa pun dapat dideklarasikan final, sementara tidak setiap variabel dapat dinyatakan statis.

Juga, kelas dapat dideklarasikan finalyang menunjukkan bahwa mereka tidak dapat diperpanjang:

final class C {}

class B extends C {}  // error!

Demikian pula, metode dapat dinyatakan final untuk menunjukkan bahwa mereka tidak dapat ditimpa oleh kelas perluasan:

class C {
    public final void foo() {}
}

class B extends C {
    public void foo() {}  // error!
}

Terima kasih atas masukannya. Kode memberikan kesalahan: kelas C {public static int n = 42; } katanya bidang tidak bisa mendeklarasikan statis dalam tipe non-statis. Mengapa saya tidak bisa mendeklarasikan atau melakukan Cn?
TechnoCorner

@ TechnoCorner hanya kelas tingkat atas (kelas yang berpotensi publicmendefinisikan file) atau statickelas dalam yang dapat menentukan staticvariabel. Kelas dalam lainnya adalah instance dari kelas luar dan tidak dapat memiliki variabel statis.
zapl

17

terakhir -

1) Ketika kami menerapkan kata kunci " final " ke suatu variabel , nilai variabel itu tetap konstan. (atau) Setelah kami mendeklarasikan variabel sebagai final . nilai variabel itu tidak dapat diubah.

2) Ini berguna ketika nilai variabel tidak berubah selama masa hidup suatu program

statis -

1) ketika kita menerapkan kata kunci " statis " ke variabel , itu berarti itu milik kelas.
2) Ketika kami menerapkan kata kunci " statis " ke suatu metode , itu berarti metode tersebut dapat diakses tanpa membuat turunan kelas apa pun


12

static berarti hanya ada satu salinan variabel dalam memori yang dibagikan oleh semua instance kelas.

Kata finalkunci hanya berarti nilainya tidak dapat diubah. Tanpa final, objek apa pun dapat mengubah nilai variabel.


3

Statis dan final memiliki beberapa perbedaan besar:

Variabel atau kelas statis akan selalu tersedia dari (cukup banyak) di mana saja. Final hanyalah kata kunci yang berarti variabel tidak dapat diubah. Jadi jika punya:

public class Test{    
   public final int first = 10;
   public static int second = 20;

   public Test(){
     second = second + 1
     first = first + 1;
   }
}

Program akan berjalan sampai mencoba mengubah integer "pertama", yang akan menyebabkan kesalahan. Di luar kelas ini, Anda hanya akan memiliki akses ke variabel "pertama" jika Anda telah membuat instance kelas. Ini berbeda dengan "kedua", yang tersedia setiap saat.


3

Pikirkan benda seperti Pembicara. Jika Speaker adalah kelas, Ini akan memiliki variabel yang berbeda seperti volume, treble, bass, warna dll. Anda mendefinisikan semua bidang ini saat menentukan kelas Speaker. Misalnya, Anda mendeklarasikan bidang warna dengan pengubah statis, itu berarti Anda memberi tahu kompiler bahwa ada persis satu salinan dari variabel ini yang ada, terlepas dari berapa kali kelas telah dipakai.

Mendeklarasikan

static final String color = "Black"; 

akan memastikan bahwa setiap kali kelas ini dipakai, nilai bidang warna akan "Hitam" kecuali jika tidak diubah.

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

Catatan: Sekarang setelah Anda mengubah warna speaker sebagai final kode ini tidak akan dijalankan, karena kata kunci akhir memastikan bahwa nilai bidang tidak pernah berubah.

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.
}}

Anda dapat menyalin / menempelkan kode ini langsung ke emulator Anda dan mencoba.


2

Perbedaan mudah,

Final : artinya Nilai variabel adalah Final dan tidak akan berubah di mana pun. Jika Anda mengatakan bahwa x akhir = 5 itu berarti x tidak dapat diubah nilainya final untuk semua orang.

Statis: berarti hanya memiliki satu objek. misalkan Anda memiliki x = 5, dalam memori ada x = 5 dan sekarang di dalam kelas. jika Anda membuat objek atau turunan dari kelas yang berarti ada kotak khusus yang mewakili kelas itu dan variabel dan metodenya. dan jika Anda membuat objek lain atau instance dari kelas itu itu berarti ada dua kotak dari kelas yang sama yang memiliki x berbeda di dalamnya dalam memori. dan jika Anda memanggil kedua x di posisi yang berbeda dan mengubah nilainya maka nilainya akan berbeda. kotak 1 memiliki x yang memiliki x = 5 dan kotak 2 memiliki x = 6. tetapi jika Anda membuat x statis itu berarti ia tidak dapat dibuat lagi. Anda dapat membuat objek kelas tetapi objek itu tidak akan memiliki x yang berbeda di dalamnya. jika x statis maka kotak 1 dan kotak 2 keduanya akan memiliki x yang sama yang memiliki nilai 5. Ya saya dapat mengubah nilai statis di mana saja karena tidak final. jadi jika saya katakan kotak 1 memiliki x dan saya mengubah nilainya menjadi x = 5 dan setelah itu saya membuat kotak lain yaitu box2 dan saya mengubah nilai box2 x ke x = 6. maka karena X bersifat statis kedua kotak memiliki x yang sama. dan kedua kotak akan memberikan nilai kotak sebagai 6 karena kotak2 menimpa nilai 5 hingga 6.

Baik final dan statis sama sekali berbeda. Final yang final tidak bisa diubah. statis yang akan tetap menjadi satu tetapi dapat diubah.

"Ini adalah contoh. Ingat variabel statis selalu dipanggil dengan nama kelas mereka. Karena mereka hanya satu untuk semua objek dari kelas itu. Jadi Kelas A memiliki x = 5, saya dapat memanggil dan mengubahnya dengan Ax = 6; "


1

Statis adalah sesuatu yang dapat dipanggil oleh objek apa pun di kelas, yang secara inheren milik tipe objek.

Variabel dapat final untuk seluruh kelas, dan itu berarti tidak dapat diubah lagi. Itu hanya dapat diatur sekali, dan mencoba mengaturnya lagi akan menghasilkan kesalahan yang dilemparkan. Ini berguna karena sejumlah alasan, mungkin Anda ingin mendeklarasikan konstanta, yang tidak dapat diubah.

Beberapa contoh kode:

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 berisi daftar lengkap kata kunci java .


Apa yang Anda maksud untuk objek tertentu? Bisakah Anda menggambarkan.
TechnoCorner

0

Saya tidak akan mencoba memberikan jawaban yang lengkap di sini. Rekomendasi saya adalah untuk fokus pada memahami apa yang masing-masing dari mereka lakukan dan kemudian harus jelas untuk melihat bahwa efeknya sama sekali berbeda dan mengapa kadang-kadang mereka digunakan bersama.

staticadalah untuk anggota kelas (atribut dan metode) dan harus dipahami berbeda dengan anggota instance (tidak statis). Saya akan merekomendasikan membaca "Memahami Instance dan Anggota Kelas" di The Java Tutorials. Saya juga bisa digunakan dalam staticblok tetapi saya tidak akan khawatir tentang hal itu sebagai permulaan.

finalmemiliki makna yang berbeda sesuai jika diterapkan pada variabel, metode, kelas atau beberapa kasus lainnya. Di sini saya lebih menyukai penjelasan Wikipedia .


-1

Nilai variabel statis dapat diubah meskipun satu salinan variabel melintasi melalui aplikasi, sedangkan nilai Final Variable dapat diinisialisasi satu kali dan tidak dapat diubah sepanjang aplikasi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.