atribut statis final pribadi vs atribut final pribadi

305

Di Jawa, apa perbedaan antara:

private final static int NUMBER = 10;

dan

private final int NUMBER = 10;

Keduanya privatedanfinal , perbedaannya adalah staticatribut.

Apa yang lebih baik? Dan mengapa?

ROMANIA_engineer
sumber
62
private final static -> buat variabel ini hanya sekali. private final -> buat variabel ini untuk setiap objek. Yang pertama menyimpan memori, lakukanlah.
user1923551
4
final staticberarti variabel ini adalah konstanta dan hanya terkait dengan kelas itu sendiri, yaitu "satu variabel konstan per kelas" sementara itu finalberarti "satu variabel konstan per instance". Akibatnya, Anda tidak bisa meletakkan final staticvariabel dalam konstruktor kelas karena konstruktor melibatkan dalam instance baru . (Anda dapat mencobanya sendiri dan akan mendapatkan kesalahan)
LittleLittleQ
1
Dengan "tidak dapat meletakkan variabel statis terakhir di konstruktor kelas" Maksud saya orang tidak dapat menginisialisasi final staticvariabel dalam konstruktor, satu-satunya cara adalah dengan menggunakan penginisialisasi statis :)
LittleLittleQ
2
@ user1923551 Efeknya terbalik untuk hal-hal yang hanya diperlukan untuk waktu terbatas dalam aplikasi besar, dalam aplikasi yang langka memori atau ketika menggunakan singleton. Memiliki barang-barang statis di setiap kelas akan menyimpan banyak memori untuk hal-hal yang tidak diperlukan. Ini juga bisa menjadi kebocoran memori untuk mendeklarasikan objek akhir statis atau koleksi.
Semoga

Jawaban:

309

Secara umum, staticberarti "terkait dengan jenis itu sendiri, bukan contoh dari jenis itu."

Itu berarti Anda dapat mereferensikan variabel statis tanpa pernah membuat instance dari tipe, dan kode apa pun yang merujuk ke variabel merujuk ke data yang sama persis. Bandingkan ini dengan variabel instan: dalam hal ini, ada satu versi independen dari variabel per instance kelas. Jadi misalnya:

Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);

mencetak 10: y.instanceVariabledan x.instanceVariableterpisah, karena xdan ymerujuk ke objek yang berbeda.

Anda dapat merujuk anggota statis melalui referensi, meskipun itu ide yang buruk untuk melakukannya. Jika kami melakukannya:

Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);

maka itu akan mencetak 20 - hanya ada satu variabel, bukan satu per contoh. Akan lebih jelas untuk menulis ini sebagai:

Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);

Itu membuat perilaku jauh lebih jelas. IDE modern biasanya akan menyarankan mengubah daftar kedua menjadi yang ketiga.

Tidak ada alasan untuk memiliki deklarasi inline menginisialisasi nilai seperti berikut, karena setiap instance akan memiliki sendiri NUMBERtetapi selalu dengan nilai yang sama (tidak dapat diubah dan diinisialisasi dengan literal). Ini sama dengan hanya memiliki satu final staticvariabel untuk semua instance.

private final int NUMBER = 10;

Karena itu jika tidak dapat diubah, tidak ada gunanya memiliki satu salinan per instance.

Tapi, masuk akal jika diinisialisasi dalam konstruktor seperti ini:

// No initialization when is declared
private final int number;

public MyClass(int n) {
   // The variable can be assigned in the constructor, but then
   // not modified later.
   number = n;
}

Sekarang, untuk setiap instance MyClass, kita dapat memiliki nilai yang berbeda tetapi tidak berubah number.

Jon Skeet
sumber
10
Sampai enum tersedia di Java 5, final statis adalah cara yang biasa untuk mendeklarasikan konstanta.
Vineet Reynolds
22
@Vineet: final statis masih merupakan cara untuk mendeklarasikan konstanta primitif, kecuali jika Anda memiliki jumlah enumerasi dari mereka =)
Chii
@ Matius: Berpotensi. Bukan untuk konstanta, tetapi untuk beberapa nilai yang terkait secara logika. Lagipula aku tidak terlalu suka lajang.
Jon Skeet
1
Sebuah pertanyaan radikal. Apakah perlu menggunakan private finallebih dari private static finaluntuk memeras / merebut kembali sedikit memori dari kelas? Katakanlah untuk calculatorperangkat dengan ram terbatas tetapi banyak sumber daya CPU.
Menangkan Myo Htet
1
@ WinMyoHtet: Jika Anda menggunakan bidang statis, hanya ada satu total. Jika Anda menggunakan bidang instance, ada satu per instance. Menggunakan bidang statis akan menjadi lebih baik kecuali jika Anda tidak memiliki instance, dalam hal ini tetap tidak berguna.
Jon Skeet
38

Untuk final , dapat diberikan nilai yang berbeda saat runtime saat diinisialisasi. Sebagai contoh

Class Test{
  public final int a;
}

Test t1  = new Test();
t1.a = 10;
Test t2  = new Test();
t2.a = 20; //fixed

Dengan demikian setiap instance memiliki nilai bidang yang berbeda a .

Untuk final statis , semua instance memiliki nilai yang sama, dan tidak dapat diubah setelah diinisialisasi pertama kali.

Class TestStatic{
      public static final int a;
}

TestStatic t1  = new TestStatic();
t1.a = 10;
TestStatic t2  = new TestStatic();
t1.a = 20;   // ERROR, CAN'T BE ALTERED AFTER THE FIRST INITIALIZATION.
lucas
sumber
90
Ini tidak akan dikompilasi! Variabel akhir harus diberi nilai, atau memiliki nilai yang ditetapkan dalam konstruktornya. Jawaban ini akan benar jika 2 konstruktor diberikan, dengan masing-masing memberikan 'a' ke nilai yang berbeda.
MattC
14
Mengkonfirmasi, ini tidak akan dikompilasi. Seperti yang dinyatakan di atas, variabel instance akhir harus di-instantiated sebelum konstruktor selesai, dan variabel-variabel kelas final harus di-instantiasi sebelum kelas dibuat (Anda bisa menggunakan blok statis). Mengapa ini mendapat begitu banyak upvotes?
Rudi Kershaw
seperti yang ditunjukkan MattC, Anda tidak dapat menetapkan ke variabel akhir setelah membuat objek itu - pada kenyataannya, Anda bahkan tidak bisa membuat objek tanpa memberikan nilai ke variabel terakhirnya ...
jamesdeath123
Untuk berjaga-jaga jika ada yang tersandung pada ini, silakan ikuti jawaban MattC.
Faz
Inilah yang menurut saya ditanyakan oleh OP, saya lupa bahwa final dapat diberi nilai pada instantiasi jika tidak diberikan pada deklarasi.
Salsero69
34

Sebuah staticvariabel tetap dalam memori untuk seumur hidup aplikasi, dan diinisialisasi saat loading kelas. Non- staticvariabel diinisialisasi setiap kali Anda membangun newobjek. Secara umum lebih baik digunakan:

private static final int NUMBER = 10;

Mengapa? Ini mengurangi jejak memori per instance. Mungkin juga menguntungkan untuk hit cache. Dan itu masuk akal: staticharus digunakan untuk hal-hal yang dibagikan di semua instance (alias objek) dari jenis tertentu (alias class).

Martijn Courteaux
sumber
variabel statis juga dibuat saat runtime. Oleh karena itu Anda dapat menggunakan variabel atau metode tersebut sebelum objek dibuat.
bobby
13
Dengan konvensi pengkodean Java, nama variabel final statis harus semuanya huruf besar.
starblue
@ Martijn Courteaux, bagaimana dengan situasi di mana kelas akan digunakan sekali selama masa pakai aplikasi! private final intakan dihapus dari memori ketika instance akan GC'ed sedangkan private static final intakan tetap dalam memori sepanjang umur aplikasi itu. Apa yang Anda sarankan dalam skenario di atas?
MANN
@MANN: Ini sangat teoretis. Tidak ada skenario use case yang berguna untuk itu. Ini bisa bermanfaat jika Anda memiliki 50000 int vars di kelas. Bahkan dalam kasus ini, ini akan menghemat memori hingga 200kb. Karena kita berbicara tentang Jawa, ini sepertinya sama sekali tidak relevan. Dalam hal perangkat kritis memori, kompiler C atau C ++ yang layak akan selalu menyejajarkan nilai-nilai integer tersebut, menghilangkan kebutuhan untuk membebaskan memori sepenuhnya.
Martijn Courteaux
17

statis berarti "terkait dengan kelas"; tanpanya, variabel dihubungkan dengan setiap instance kelas. Jika statis, itu berarti Anda hanya memiliki satu di memori; jika tidak, Anda akan memiliki satu untuk setiap instance yang Anda buat. statis berarti variabel akan tetap berada dalam memori selama kelas dimuat; tanpanya, variabel dapat di-gc ketika instance-nya.

Duffymo
sumber
Variabel instan mendapatkan gc'd setiap kali semua referensi / objek untuk itu mati, kan?
Ruchir Baronia
Instance adalah gc'd, tetapi statika dikaitkan dengan kelas, bukan instance. Selama kelas masih tersimpan dalam memori, Anda akan dapat merujuk ke instance dan metode statis publiknya. Mereka masuk ke perm gen (atau apa pun yang setara JDK 8) dan tidak gc'd.
duffymo
Salah. Jika Anda memiliki referensi ke instance di memori Anda dapat mengakses metode dan instans yang tersedia. Sisanya salah. Anda gagal memahami perbedaan antara kelas dan instansnya.
duffymo
13

Membaca jawaban yang saya temukan tidak ada tes nyata yang benar-benar langsung ke intinya. Ini 2 sen saya:

public class ConstTest
{

    private final int         value             = 10;
    private static final int  valueStatic       = 20;
    private final File        valueObject       = new File("");
    private static final File valueObjectStatic = new File("");

    public void printAddresses() {


        System.out.println("final int address " +
                ObjectUtils.identityToString(value));
        System.out.println("final static int address " +
                ObjectUtils.identityToString(valueStatic));
        System.out.println("final file address " + 
                ObjectUtils.identityToString(valueObject));
        System.out.println("final static file address " + 
                ObjectUtils.identityToString(valueObjectStatic));
    }


    public static void main(final String args[]) {


        final ConstTest firstObj = new ConstTest();
        final ConstTest sndObj = new ConstTest();

        firstObj.printAdresses();
        sndObj.printAdresses();
    }

}

Hasil untuk objek pertama:

final int address java.lang.Integer@6d9efb05
final static int address java.lang.Integer@60723d7c
final file address java.io.File@6c22c95b
final static file address java.io.File@5fd1acd3

Hasil untuk objek ke-2:

final int address java.lang.Integer@6d9efb05
final static int address java.lang.Integer@60723d7c
final file address java.io.File@3ea981ca
final static file address java.io.File@5fd1acd3

Kesimpulan:

Seperti yang saya pikir java membuat perbedaan antara tipe primitif dan lainnya. Tipe primitif di Jawa selalu "di-cache", sama untuk string literal (bukan objek String baru), jadi tidak ada perbedaan antara anggota statis dan non-statis.

Namun ada duplikasi memori untuk anggota non-statis jika mereka bukan turunan dari tipe primitif.

Mengubah nilai valueStatic ke 10 bahkan akan melangkah lebih jauh karena Java akan memberikan alamat yang sama ke dua variabel int.

StackHola
sumber
2
Autoboxing dari 'int' -> Integer menyebabkan kebingungan di sini. Anda melihat bahwa autoboxing dari beberapa nilai int (kecil) mengarah ke objek Integer yang sama.
dkneller
@StackHola @dkneller Memang, autoboxing adalah detail yang sangat penting yang terjadi di sini. Tanda tangan ObjectUtils.identityToString(Object). (Selain itu, Java tidak memiliki referensi lewat referensi). Tes yang sangat berguna adalah mengalokasikan dua objek dan mengubah nilai public final int FOO = 10variabel menggunakan refleksi Java dengan cara paksa. Kemudian periksa apakah objek lain juga telah mengubah nilainya.
Martijn Courteaux
11

Sementara jawaban lain tampaknya membuatnya cukup jelas bahwa pada umumnya tidak ada alasan untuk menggunakan konstanta non-statis, saya tidak dapat menemukan orang yang menunjukkan bahwa ada kemungkinan untuk memiliki berbagai instance dengan nilai yang berbeda pada variabel konstan mereka.

Perhatikan contoh berikut:

public class TestClass {
    private final static double NUMBER = Math.random();

    public TestClass () {
        System.out.println(NUMBER);
    }
}

Membuat tiga contoh dari TestClass akan mencetak nilai acak yang sama tiga kali, karena hanya satu nilai yang dihasilkan dan disimpan ke dalam konstanta statis.

Namun, ketika mencoba contoh berikut sebagai gantinya:

public class TestClass {
    private final double NUMBER = Math.random();

    public TestClass () {
        System.out.println(NUMBER);
    }
}

Membuat tiga instance dari TestClass sekarang akan mencetak tiga nilai acak yang berbeda, karena setiap instance memiliki nilai konstan yang dihasilkan secara acak.

Saya tidak dapat memikirkan situasi di mana akan sangat berguna untuk memiliki nilai konstan yang berbeda pada contoh yang berbeda, tetapi saya harap ini membantu menunjukkan bahwa ada perbedaan yang jelas antara final statis dan non-statis.

Michiel
sumber
2

Seperti yang sudah dikatakan Jon, variabel statis, juga disebut sebagai variabel kelas, adalah variabel yang ada di seluruh instance kelas.

Saya menemukan contohnya di sini :

public class StaticVariable
{
  static int noOfInstances;
  StaticVariable()
  {
    noOfInstances++;
  }
  public static void main(String[] args)
  {
    StaticVariable sv1 = new StaticVariable();
    System.out.println("No. of instances for sv1 : " + sv1.noOfInstances);

    StaticVariable sv2 = new StaticVariable();
    System.out.println("No. of instances for sv1 : "  + sv1.noOfInstances);
    System.out.println("No. of instances for st2 : "  + sv2.noOfInstances);

    StaticVariable sv3 = new StaticVariable();
    System.out.println("No. of instances for sv1 : "  + sv1.noOfInstances);
    System.out.println("No. of instances for sv2 : "  + sv2.noOfInstances);
    System.out.println("No. of instances for sv3 : "  + sv3.noOfInstances);
  }
}

Output dari program diberikan di bawah ini:

Seperti yang dapat kita lihat dalam contoh ini setiap objek memiliki salinan variabel kelasnya sendiri.

C:\java>java StaticVariable
No. of instances for sv1 : 1
No. of instances for sv1 : 2
No. of instances for st2 : 2
No. of instances for sv1 : 3
No. of instances for sv2 : 3
No. of instances for sv3 : 3
Novitzky
sumber
2

Dari tes yang saya buat, variabel final statis tidak sama dengan variabel final (non-statis)! Variabel final (non-statis) dapat berbeda dari objek ke objek !!! Tapi itu hanya jika inisialisasi dibuat di dalam konstruktor! (Jika tidak diinisialisasi dari konstruktor maka itu hanya buang-buang memori karena ia menciptakan variabel akhir untuk setiap objek yang dibuat yang tidak dapat diubah.)

Sebagai contoh:

class A
{
    final int f;
    static final int sf = 5;

    A(int num)
    {
        this.f = num;
    }

    void show()
    {
        System.out.printf("About Object: %s\n Final: %d\n Static Final: %d\n\n", this.toString(), this.f, sf);
    }

    public static void main(String[] args)
    {
        A ob1 = new A(14);
        ob1.show();

        A ob2 = new A(21);
        ob2.show();

    }
}

Apa yang muncul di layar adalah:

Tentang Objek: A @ addbf1 Final: 14 Final Statis: 5

Tentang Objek: A @ 530daa Final: 21 Statis Final: 5

Mahasiswa IT tahun pertama yang anonim, Yunani

Anonim
sumber
ini bukan jawaban :(
Sanjaya Pandey
2

Selanjutnya untuk jawaban Jon jika Anda menggunakan final statis itu akan berperilaku sebagai semacam "definisi". Setelah Anda mengkompilasi kelas yang menggunakannya, itu akan berada dalam file .class yang dikompilasi. Periksa utas saya di sini .

Untuk tujuan utama Anda: Jika Anda tidak menggunakan NUMBER secara berbeda dalam instance kelas yang berbeda, saya akan menyarankan untuk menggunakan final dan statis. (Anda hanya perlu mengingat untuk tidak menyalin file kelas yang dikompilasi tanpa mempertimbangkan kemungkinan masalah seperti yang dijelaskan dalam studi kasus saya. Sebagian besar kasus ini tidak terjadi, jangan khawatir :))

Untuk menunjukkan kepada Anda cara menggunakan nilai yang berbeda dalam kasus, periksa kode ini:

public class JustFinalAttr {
  public final int Number;

  public JustFinalAttr(int a){
    Number=a;
  }
}

...System.out.println(new JustFinalAttr(4).Number);
BlondCode
sumber
Saya memiliki tautan di sini untuk perbandingan terperinci. Maaf kawan, ini sudah dimoderasi kurasa.
BlondCode
Tautan kembali. Seorang editor telah mengeluarkannya sebagai mati. Tampaknya hidup sekarang.
Erick G. Hagstrom
2

Ini dua sen saya:

final           String CENT_1 = new Random().nextInt(2) == 0 ? "HEADS" : "TAILS";
final   static  String CENT_2 = new Random().nextInt(2) == 0 ? "HEADS" : "TAILS";

Contoh:

package test;

public class Test {

    final long OBJECT_ID = new Random().nextLong();
    final static long CLASSS_ID = new Random().nextLong();

    public static void main(String[] args) {
        Test[] test = new Test[5];
        for (int i = 0; i < test.length; i++){
            test[i] = new Test();
            System.out.println("Class id: "+test[i].CLASSS_ID);//<- Always the same value
            System.out.println("Object id: "+test[i].OBJECT_ID);//<- Always different
        }
    }
}

Kuncinya adalah bahwa variabel dan fungsi dapat mengembalikan nilai yang berbeda. Oleh karena itu variabel akhir dapat ditugaskan dengan nilai yang berbeda.

Adrian
sumber
Bisakah Anda jelaskan mana yang lebih baik dan mengapa?
Daniel
2

Contoh sederhana lainnya untuk memahami penggunaan variabel statis, final statis, final. Komentar kode memiliki penjelasan yang tepat.

public class City {

    // base price that is always same for all objects[For all cities].
    private static double iphone_base_price = 10000;

    // this is total price = iphone_base_price+iphone_diff;
    private double iphone_citi_price;

    // extra price added to iphone_base_price. It is constant per city. Every
    // city has its own difference defined,
    private final double iphone_diff;

    private String cityName = "";

    // static final will be accessible everywhere within the class but cant be
    // changed once initialized.
    private static final String countryName = "India";

    public City(String cityName, double iphone_diff) {
        super();
        this.iphone_diff = iphone_diff;
        iphone_citi_price = iphone_base_price + iphone_diff;
        this.cityName = cityName;

    }

    /**
     * get phone price
     * 
     * @return
     */
    private double getPrice() {

        return iphone_citi_price;
    }

    /**
     * Get city name
     * 
     * @return
     */
    private String getCityName() {

        return cityName;
    }

    public static void main(String[] args) {

        // 300 is the
        City newyork = new City("Newyork", 300);
        System.out.println(newyork.getPrice() + "  " + newyork.getCityName());

        City california = new City("California", 800);
        System.out.println(california.getPrice() + "  " + california.getCityName());

        // We cant write below statement as a final variable can not be
        // reassigned
        // california.iphone_diff=1000; //************************

        // base price is defined for a class and not per instances.
        // For any number of object creation, static variable's value would be the same
        // for all instances until and unless changed.
        // Also it is accessible anywhere inside a class.
        iphone_base_price = 9000;

        City delhi = new City("delhi", 400);
        System.out.println(delhi.getPrice() + "  " + delhi.getCityName());

        City moscow = new City("delhi", 500);
        System.out.println(moscow.getPrice() + "  " + moscow.getCityName());

        // Here countryName is accessible as it is static but we can not change it as it is final as well. 
        //Something are meant to be accessible with no permission to modify it. 
        //Try un-commenting below statements
        System.out.println(countryName);

        // countryName="INDIA";
        // System.out.println(countryName);

    }

}
Vaibs
sumber
1

sangat sedikit, dan statis

Tidak ada banyak perbedaan karena keduanya adalah konstanta. Untuk sebagian besar objek data kelas, statis akan berarti sesuatu yang terkait dengan kelas itu sendiri, hanya ada satu salinan tidak peduli berapa banyak objek yang dibuat dengan yang baru.

Karena ini adalah sebuah konstanta, ia mungkin sebenarnya tidak disimpan di kelas atau dalam sebuah instance, tetapi kompiler masih tidak akan membiarkan Anda mengakses objek instance dari metode statis, bahkan jika ia tahu apa yang akan terjadi. Keberadaan API refleksi mungkin juga memerlukan beberapa pekerjaan yang tidak berguna jika Anda tidak membuatnya statis.

DigitalRoss
sumber
1

Karena variabel dalam kelas dinyatakan sebagai final DAN diinisialisasi dalam perintah yang sama, sama sekali tidak ada alasan untuk tidak menyatakannya sebagai statis, karena itu akan memiliki nilai yang sama tidak peduli instance. Jadi, semua instance dapat berbagi alamat memori yang sama untuk suatu nilai, sehingga menghemat waktu pemrosesan dengan menghilangkan kebutuhan untuk membuat variabel baru untuk setiap instance dan menghemat memori dengan berbagi 1 alamat umum.

NarekOnLine
sumber
1

private static final akan dianggap sebagai konstanta dan konstanta hanya dapat diakses di dalam kelas ini. Karena, kata kunci statis disertakan, nilainya akan konstan untuk semua objek kelas.

nilai variabel akhir pribadi akan seperti konstanta per objek.

Anda dapat merujuk java.lang.String atau mencari contoh di bawah ini.

public final class Foo
{

    private final int i;
    private static final int j=20;

    public Foo(int val){
        this.i=val;
    }

    public static void main(String[] args) {
        Foo foo1= new Foo(10);

        Foo foo2= new Foo(40);

        System.out.println(foo1.i);
        System.out.println(foo2.i);
        System.out.println(check.j);
    }
}

//Keluaran:

10
40
20
san242
sumber
0

Yang statis adalah anggota yang sama pada semua instance kelas dan kelas itu sendiri.
Non-statis adalah satu untuk setiap instance (objek), jadi dalam kasus Anda yang tepat itu adalah pemborosan memori jika Anda tidak menempatkan statis.

Omar Al-Ithawi
sumber
0

Jika Anda menandai variabel ini statis maka seperti yang Anda tahu, Anda akan memerlukan metode statis untuk mengakses kembali nilai-nilai ini, ini akan berguna jika Anda sudah berpikir untuk menggunakan variabel-variabel ini hanya dalam metode statis. Jika demikian maka ini akan menjadi yang terbaik.

Namun Anda dapat menjadikan variabel sekarang sebagai publik karena tidak ada yang dapat memodifikasinya seperti "System.out", itu lagi tergantung pada niat Anda dan apa yang ingin Anda capai.

Sanjay
sumber
1
Metode statis tidak akan diperlukan untuk mengakses variabel statis - Saya pikir Anda berpikir untuk "mengakses variabel instan dari metode statis" (tidak diizinkan).
ataulm
0

Katakanlah jika kelas tidak akan memiliki lebih dari satu instance, yang mana yang membutuhkan lebih banyak memori:

ID int akhir statis pribadi = 250; atau ID akhir pribadi = 250;

Saya mengerti bahwa statis akan merujuk ke tipe kelas dengan hanya satu salinan di memori dan non statis akan berada di lokasi memori baru untuk setiap variabel instance. Namun secara internal jika kita hanya membandingkan 1 instance dari kelas yang sama (yaitu lebih dari 1 instance tidak akan dibuat), lalu adakah overhead dalam hal ruang yang digunakan oleh 1 variabel final statis?

Rommel
sumber
1
Tolong jangan hanya mengulang, jawaban apa yang sudah dibahas.
pengguna tidak dikenal
0

Variabel statis milik kelas (yang berarti semua objek berbagi variabel itu). Variabel non statis adalah milik setiap objek.

public class ExperimentFinal {

private final int a;
private static final int b = 999; 

public ExperimentFinal(int a) {
    super();
    this.a = a;
}
public int getA() {
    return a;
}
public int getB() {
    return b;
}
public void print(int a, int b) {
    System.out.println("final int: " + a + " \nstatic final int: " + b);
}
public static void main(String[] args) {
    ExperimentFinal test = new ExperimentFinal(9);
    test.print(test.getA(), test.getB());
} }

Seperti yang Anda lihat contoh di atas, untuk "final int" kita dapat menetapkan variabel kita untuk setiap instance (objek) kelas, namun untuk "static final int", kita harus menetapkan variabel di kelas (variabel statis milik kelas tersebut ).

Tsasaa
sumber
0

Jika Anda menggunakan statis, nilai variabel akan sama di seluruh instance Anda, jika diubah dalam satu contoh, yang lain juga akan berubah.

Warren Jennings -LightningStor
sumber
0

Final: Setelah variabel final telah ditetapkan, selalu berisi nilai yang sama. dimanapun variabelnya statis atau tidak statis: itu hanya akan menjadi satu variabel untuk semua instance yang diinisialisasi satu kali dalam Memori

Hashem Khaled
sumber
-1

Ini mungkin bisa membantu

public class LengthDemo {
public static void main(String[] args) {
    Rectangle box = new Rectangle();
    System.out.println("Sending the value 10.0 "
            + "to the setLength method.");
    box.setLength(10.0);
    System.out.println("Done.");
    }
}
G rye
sumber
1
yakin ini jawaban untuk pertanyaan ini?
mikus
-2

Kata kunci "Static" membuat properti variabel kelas daripada contoh individu kelas. Akan ada satu salinan dari variabel yang dibagikan di antara semua instance dari kelas itu. Setiap perubahan dalam keadaan variabel statis akan tercermin di semua instance. Tambahkan final ke statis dan kami mendapatkan variabel yang telah diinisialisasi sekali dan untuk semua pada waktu pemuatan kelas dan tidak dapat diubah nanti oleh instance kelas apa pun. Variabel akhir statis perlu diinisialisasi pada waktu deklarasi jika kita memiliki kesalahan waktu kompilasi. Sejauh menyangkut bidang instance pribadi, ini mengacu pada properti / keadaan objek / instance kelas. Setiap instance / objek dari kelas akan memiliki salinan variabel instance sendiri. Ketika variabel instan dinyatakan final, itu berarti kita tidak dapat mengubah nilainya untuk contoh ini. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan muncul. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan muncul. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek.

Uzma Nasir
sumber