Pembolehubah dalam Java: Apakah itu dan bagaimana ia digunakan
Sumber:
Hackernoon Terdapat empat jenis pembolehubah yang berbeza di Jawa, bergantung pada tempat ia diisytiharkan dalam program. Hari ini anda akan mempelajari contoh dan perbezaan setiap jenis. 1. Pembolehubah instance atau
medan Instance ialah pembolehubah yang diisytiharkan di dalam kelas tanpa kata kunci
statik , tetapi di luar kaedah, pembina atau blok kod. Pembolehubah sedemikian boleh diisytiharkan di mana-mana dalam kelas. Anda boleh mengisytiharkannya dengan atau tanpa pengubah suai akses, seperti
public ,
private ,
protected atau
lalai (bukan kata kunci).
public class MyClass {
private String instanceField1;
public MyClass(){}
public int anotherInstanceField2;
public void setInstanceField(String parameterVariable) {...}
boolean instanceField3;
public static void main(String[] args) {
System.out.println("field 1 value: " + instanceField1);
System.out.println("field 2 value: " + anotherInstanceField2);
System.out.println("field 3 value: " + instanceField3);
}
}
Jika medan contoh tidak diberikan nilai pada masa pengisytiharan, ia diberikan nilai lalai sifar jika ia adalah jenis primitif, seperti (
int ,
boolean ,
long ,
float ), atau
batal jika ia bukan jenis primitif, seperti (
String ,
Integer ,
AnyClass ). Ia dipanggil medan atau pembolehubah contoh kerana ia tergolong dalam contoh mana-mana objek yang dicipta daripada kelas di mana ia diisytiharkan.
public Main {
public static void main(String[] args) {
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
obj1.anotherInstanceField2 = 11;
obj2.anotherInstanceField2 = 33;
System.out.println(obj1.anotherInstanceField2);
System.out.println(obj2.anotherInstanceField2);
}
}
Oleh itu, setiap medan contoh adalah unik untuk objeknya, seperti yang dilihat dalam coretan di atas. Di dalamnya,
obj1 dan
obj2 mempunyai nilai unik yang diberikan kepada medan contoh masing-masing.
2. Medan kelas atau
medan statik ialah medan yang diisytiharkan dengan kata kunci
statik . Mereka diisytiharkan di dalam kelas, tetapi di luar kaedah, pembina, atau blok kod. Ia juga boleh diisytiharkan di mana-mana kedudukan dalam kelas, dengan atau tanpa pengubah akses, seperti
public ,
private ,
protected , atau
lalai (bukan kata kunci).
public class MyClass {
public static String staticField;
public MyClass(){}
}
class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.staticField
MyClass.staticField = "I am a static field";
System.out.println(MyClass.staticField);
}
}
Medan statik hanya boleh diakses melalui kelasnya dan bukan daripada sebarang objek seperti yang ditunjukkan dalam coretan kod di atas. 3.
Parameter atau
pembolehubah Argumen ialah pembolehubah yang diisytiharkan di dalam konstruk kaedah antara pendakap kerinting pembukaan dan penutup tandatangan kaedah. Ia digunakan untuk menghantar nilai atau objek kepada kaedah.
public class MyClass {
public String instanceField;
public MyClass(){}
public void setInstanceField(String parameterVariable) {
instanceField = parameterVariable;
}
}
class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.setInstanceField("From a parameter variable");
System.out.println(obj.instanceField);
}
}
4.
Pembolehubah setempat ialah pembolehubah yang diisytiharkan di dalam kaedah atau mana-mana blok kod, contohnya, di dalam blok pernyataan
if ,
for loop ,
while loop , blok pernyataan
suis dan sebagainya.
public Main {
public static void main(String[] args) {
MyClass obj1 = new MyClass();
int id = 1;
if (id > 1) {
String tempName = "Austin";
}
}
}
Dalam kod ini anda boleh melihat penggunaan rujukan dengan beberapa pembolehubah, manakala
id pembolehubah tempatan tidak disebut sebagai pembolehubah rujukan. Mana-mana pembolehubah bukan primitif ialah pembolehubah rujukan. Sebagai contoh,
obj1 ialah pembolehubah jenis
MyClass dan
tempName ialah pembolehubah jenis
String , dan di sini kedua-dua jenis bukan jenis primitif. Dalam kes ini,
id ialah pembolehubah jenis
int , yang merupakan jenis data primitif. Oleh itu, ia adalah pembolehubah bukan rujukan.
5 Perkara Yang Anda Perlu Tahu Mengenai Pensirilan dan Penyahserikatan di Jawa
Sumber:
Devgenius Dengan tutorial ini, anda akan meningkatkan pengetahuan anda tentang cara pensirilan dan penyahserikatan berfungsi. Pensirian dalam Java membantu menukar objek sedia ada kepada aliran bait. Sebaliknya, penyahserikatan menjadikan aliran bait sebagai objek. Menggunakan bersiri dan penyahserikatan dalam Java, maklumat tentang objek boleh dipindahkan dari satu JVM ke JVM yang lain.
#1 Sirialisasi
Sebelum pergi ke perincian, mari kita lihat kelas
SerializeUtils.java dan
Person.java . Di sini mereka akan membantu kami melakukan penyirian dan penyahserikan menggunakan contoh khusus.
SerializeUtils.java
package com.techteam.serialization;
import java.io.*;
public class SerializeUtils {
public static <T> void serialize(T input, String fileName) throws IOException {
FileOutputStream file = new FileOutputStream(fileName);
ObjectOutputStream out = new ObjectOutputStream(file);
out.writeObject(input);
out.close();
file.close();
}
public static <T> T deserialize(String fileName) throws IOException, ClassNotFoundException {
FileInputStream file = new FileInputStream(fileName);
ObjectInputStream in = new ObjectInputStream(file);
T result = (T) in.readObject();
return result;
}
public static void externalSeialize(Externalizable e, String fileName) throws IOException {
FileOutputStream file = new FileOutputStream(fileName);
ObjectOutputStream out = new ObjectOutputStream(file);
e.writeExternal(out);
out.close();
file.close();
}
public static void externalDeseialize(Externalizable e, String fileName) throws IOException, ClassNotFoundException {
FileInputStream file = new FileInputStream (fileName);
ObjectInputStream in = new ObjectInputStream (file);
e.readExternal(in);
in.close();
file.close();
}
}
Person.java
package com.techteam.serialization;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Seperti yang dinyatakan, siri membantu menukar objek menjadi aliran bait. Ini bermakna semua maklumat tentang objek juga ditukar kepada aliran bait, seperti kaedah, sifat dan data. Berikut ialah contoh cara sesuatu objek disirikan:
package com.techteam.serialization;
import java.io.IOException;
public class SerializationMain {
public static void main(String[] args) throws IOException {
Person p = new Person();
p.setId(1);
p.setName("Tech team members");
p.setAge(20);
SerializeUtils.serialize(p, "/person.txt");
}
}
Selepas proses bersiri kami mempunyai fail dengan kandungan berikut:
#2 Penyahserikatan
Jika dalam contoh sebelumnya kita mencipta aliran bait dengan mensirikan objek, sekarang mari lihat bagaimana kita kembali ke objek menggunakan penyahserilan:
package com.techteam.serialization;
import java.io.IOException;
public class DeserializationMain {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person p = SerializeUtils.deserialize("/person.txt");
System.out.println("Person data:");
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
Berikut ialah data selepas proses penyahserikatan:
#3 Versi Bersiri UID
SerialVersionUID bermaksud nombor pengenalan unik untuk setiap versi proses bersiri dan penyahsirilan. Nombor ini digunakan untuk memastikan kedua-dua objek bersiri dan desiri menggunakan kelas yang serasi. Untuk
Person.java, saya ingin meningkatkan serialVersionUID kepada 2. Mari lihat output selepas menyahsiri fail person.txt.
#4 Kata Kunci Sementara
Semasa proses bersiri dan penyahserilan, kadangkala kita tidak perlu mensiri semua maklumat tentang objek. Dengan menggunakan proses sementara untuk pembolehubah, kita boleh mengabaikan pembolehubah tersebut daripada objek yang bersiri. Contoh di bawah akan membantu memahami perkara ini dengan lebih jelas:
package com.techteam.serialization;
import java.io.IOException;
import java.io.Serializable;
public class PersonWithTransient implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private transient int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
PersonWithTransient p = new PersonWithTransient();
p.setId(2);
p.setName("Tech team members(transient)");
p.setAge(50);
SerializeUtils.serialize(p, "/person_transient.txt");
PersonWithTransient deserializeP = SerializeUtils.deserialize("/person_transient.txt");
System.out.println("Person without transient data:");
System.out.println(deserializeP.getId());
System.out.println(deserializeP.getName());
System.out.println(deserializeP.getAge());
}
}
Dalam kod di atas, kami telah menggunakan kata kunci
sementara untuk pembolehubah
umur . Dan inilah yang kami dapat selepas proses bersiri dan penyahserikatan.
#5 Antara Muka Boleh Luar
Di Java, apabila kita ingin menyesuaikan proses bersiri dan penyahserikatan, kita boleh menggunakan proses peralihan untuk mengabaikan pembolehubah yang kita tidak perlukan untuk proses bersiri dan penyahsirilan. Satu lagi cara untuk memudahkan dan meningkatkan prestasi ialah menggunakan antara muka
Externalizable dan bukannya antara muka
Serializable . Mari lihat contoh:
package com.techteam.serialization;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class PersonExternalizable implements Externalizable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(this.name);
out.writeInt(this.age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.name = in.readUTF();
this.age = in.readInt();
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
PersonExternalizable p = new PersonExternalizable();
p.setId(3);
p.setName("Tech team members(Externalizable)");
p.setAge(30);
SerializeUtils.externalSeialize(p, "/person_externalizable.txt");
PersonExternalizable deserializeP = new PersonExternalizable();
SerializeUtils.externalDeseialize(deserializeP, "/person_externalizable.txt");
System.out.println("Person data:");
System.out.println(deserializeP.getId());
System.out.println(deserializeP.getName());
System.out.println(deserializeP.getAge());
}
}
Seperti yang anda lihat, apabila menggunakan
Externalizable , kami boleh menulis logik tersuai dengan mudah, mengabaikan pembolehubah dan mendapatkan prestasi yang lebih baik daripada menggunakan
Serializable . Sekarang mari kita lihat output:
Kesimpulan
Mudah-mudahan, melalui artikel ini, anda telah mendapat pemahaman yang jelas tentang cara bersiri dan penyahserikatan berfungsi di Jawa, dan contoh di atas boleh membantu anda dalam amalan pada masa hadapan.
GO TO FULL VERSION