JavaRush /Blog Java /Random-VI /Nghỉ giải lao #180. Các biến trong Java: chúng là gì và c...

Nghỉ giải lao #180. Các biến trong Java: chúng là gì và chúng được sử dụng như thế nào. 5 điều bạn nên biết về tuần tự hóa và giải tuần tự hóa trong Java

Xuất bản trong nhóm

Biến trong Java: Chúng là gì và được sử dụng như thế nào

Nguồn: Hackernoon Có bốn loại biến khác nhau trong Java, tùy thuộc vào vị trí chúng được khai báo trong chương trình. Hôm nay bạn sẽ tìm hiểu các ví dụ và sự khác biệt của từng loại. Nghỉ giải lao #180.  Các biến trong Java: chúng là gì và chúng được sử dụng như thế nào.  5 điều bạn nên biết về tuần tự hóa và giải tuần tự hóa trong Java - 11. Biến thực thể hoặc trường thực thể là các biến được khai báo bên trong một lớp không có từ khóa static nhưng bên ngoài phương thức, hàm tạo hoặc khối mã. Các biến như vậy có thể được khai báo ở bất kỳ đâu trong lớp. Bạn có thể khai báo chúng có hoặc không có công cụ sửa đổi truy cập, chẳng hạn như public , private , protected hoặc default (không phải từ khóa).
public class MyClass {

  //instance field 1
  private String instanceField1;

  public MyClass(){} //Constructor

  //instance field 2
  public int anotherInstanceField2;

  public void setInstanceField(String parameterVariable) {...} //instance method

  //instance field 3
  boolean instanceField3;

  public static void main(String[] args) {
    System.out.println("field 1 value: " + instanceField1); // = null
    System.out.println("field 2 value: " + anotherInstanceField2); // = 0
    System.out.println("field 3 value: " + instanceField3); // = 0
  }
}
Nếu một trường đối tượng không được gán giá trị tại thời điểm khai báo, thì nó sẽ được gán giá trị mặc định là 0 nếu nó là kiểu nguyên thủy, chẳng hạn như ( int , boolean , long , float ) hoặc null nếu nó không phải là kiểu nguyên thủy, chẳng hạn như ( String , Integer , AnyClass ). Chúng được gọi là các trường hoặc biến thể hiện vì chúng thuộc về thể hiện của bất kỳ đối tượng nào được tạo từ lớp mà chúng được khai báo.
public Main {

  public static void main(String[] args) {
    MyClass obj1 = new MyClass();
    MyClass obj2 = new MyClass();

    //Now we can access every 'public' field declared in the MyClass class
    // from the newly created object 'obj'

    obj1.anotherInstanceField2 = 11;
    obj2.anotherInstanceField2 = 33;

    System.out.println(obj1.anotherInstanceField2); // prints '11'
    System.out.println(obj2.anotherInstanceField2); // prints '33'
  }
}
Do đó, mỗi trường phiên bản là duy nhất cho đối tượng của nó, như đã thấy trong đoạn mã trên. Trong đó, obj1obj2 có các giá trị duy nhất được gán cho các trường đối tượng tương ứng của chúng. 2. Trường lớp hay trường tĩnh là các trường được khai báo bằng từ khóa static . Chúng được khai báo bên trong lớp, nhưng bên ngoài phương thức, hàm tạo hoặc khối mã. Chúng cũng có thể được khai báo ở bất kỳ vị trí nào trong một lớp, có hoặc không có công cụ sửa đổi truy cập, chẳng hạn như public , private , protected hoặc default (không phải từ khóa).
public class MyClass {

  //static field
  public static String staticField;

  public MyClass(){} //Constructor

}

class Main {

  public static void main(String[] args) {

    MyClass obj = new MyClass();

    obj.staticField //will throw Not defined Error

    //Now we cannot access the static field declared in MyClass class from the
     // newly created object 'obj' because static fields are not attached to any
    // object. They belong solely to the class they are declared and can only be
    // accessed from their class.

    MyClass.staticField = "I am a static field";
    System.out.println(MyClass.staticField); // prints 'I am a static field'
  }
}
Các trường tĩnh chỉ có thể được truy cập thông qua các lớp của chúng chứ không phải từ bất kỳ đối tượng nào như được hiển thị trong đoạn mã ở trên. 3. Biến tham số hoặc biến đối số là các biến được khai báo bên trong cấu trúc phương thức giữa dấu ngoặc nhọn mở và đóng của chữ ký phương thức. Chúng được sử dụng để truyền giá trị hoặc đối tượng cho một phương thức.
public class MyClass {

  //instance field
  public String instanceField;

  public MyClass(){} //Constructor

  //instance method with a parameter variable
   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); // prints 'From a parameter variable'
  }
}
4. Biến cục bộ là các biến được khai báo bên trong một phương thức hoặc bất kỳ khối mã nào, ví dụ: bên trong một khối câu lệnh if , for loop , while loop , khối câu lệnh switch , v.v.
public Main {

  public static void main(String[] args) {
    MyClass obj1 = new MyClass(); // 'obj1' is local reference variable

    int id = 1; // 'name' is a local variable here.

    if (id > 1) {
        String tempName = "Austin"; // 'tempName' is a local reference variable
     }
  }
}
Trong mã này, bạn có thể nhận thấy việc sử dụng tham chiếu với một số biến, trong khi id biến cục bộ không được đề cập làm biến tham chiếu. Bất kỳ biến không nguyên thủy nào đều là biến tham chiếu. Ví dụ: obj1 là một biến kiểu MyClasstempName là một biến kiểu String và ở đây cả hai kiểu đều không phải là kiểu nguyên thủy. Trong trường hợp này, id là một biến có kiểu int , là kiểu dữ liệu nguyên thủy. Vì vậy, nó là một biến không tham chiếu.

5 điều bạn nên biết về tuần tự hóa và giải tuần tự hóa trong Java

Nguồn: Devgenius Với hướng dẫn này, bạn sẽ nâng cao kiến ​​thức của mình về cách hoạt động của quá trình tuần tự hóa và giải tuần tự hóa. Tuần tự hóa trong Java giúp chuyển đổi một đối tượng hiện có thành luồng byte. Ngược lại, quá trình khử tuần tự hóa làm cho luồng byte trở thành một đối tượng. Sử dụng tuần tự hóa và giải tuần tự hóa trong Java, thông tin về các đối tượng có thể được chuyển từ JVM này sang JVM khác.

#1 Tuần tự hóa

Trước khi đi vào chi tiết, chúng ta hãy xem xét các lớp SerializeUtils.javaPerson.java . Ở đây họ sẽ giúp chúng ta thực hiện tuần tự hóa và giải tuần tự hóa bằng các ví dụ cụ thể.

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();
    }
}

Người.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;
    }
}
Như đã đề cập, tuần tự hóa giúp chuyển đổi một đối tượng thành một luồng byte. Điều này có nghĩa là tất cả thông tin về đối tượng cũng được chuyển đổi thành luồng byte, chẳng hạn như phương thức, thuộc tính và dữ liệu. Đây là một ví dụ về cách một đối tượng được tuần tự hóa:
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");
    }
}
Sau quá trình serialization chúng ta có một file có nội dung như sau: Nghỉ giải lao #180.  Các biến trong Java: chúng là gì và chúng được sử dụng như thế nào.  5 điều bạn nên biết về tuần tự hóa và giải tuần tự hóa trong Java - 2

#2 Khử lưu huỳnh

Nếu trong ví dụ trước, chúng ta đã tạo một luồng byte bằng cách tuần tự hóa một đối tượng, thì bây giờ hãy xem cách chúng ta quay lại đối tượng bằng cách sử dụng quá trình giải tuần tự hóa:
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());
    }
}
Đây là dữ liệu sau quá trình khử lưu huỳnh: Nghỉ giải lao #180.  Các biến trong Java: chúng là gì và chúng được sử dụng như thế nào.  5 điều bạn nên biết về tuần tự hóa và giải tuần tự hóa trong Java - 3

#3 UID phiên bản nối tiếp

SerialVersionUID có nghĩa là số nhận dạng duy nhất cho mỗi phiên bản của quy trình tuần tự hóa và giải tuần tự hóa. Số này được sử dụng để đảm bảo rằng cả đối tượng được tuần tự hóa và giải tuần tự hóa đều sử dụng các lớp tương thích. Đối với Person.java, tôi muốn tăng serialVersionUID lên 2. Hãy xem kết quả đầu ra sau khi giải tuần tự hóa tệp Person.txt. Nghỉ giải lao #180.  Các biến trong Java: chúng là gì và chúng được sử dụng như thế nào.  5 điều bạn nên biết về tuần tự hóa và giải tuần tự hóa trong Java - 4

#4 Từ khóa nhất thời

Trong quá trình tuần tự hóa và giải tuần tự hóa, đôi khi chúng ta không cần tuần tự hóa tất cả thông tin về một đối tượng. Bằng cách sử dụng quy trình nhất thời cho các biến, chúng ta có thể bỏ qua các biến đó khỏi đối tượng được tuần tự hóa. Ví dụ dưới đây sẽ giúp hiểu rõ hơn điều này:
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());
    }
}
Trong đoạn mã trên, chúng tôi đã sử dụng từ khóa tạm thời cho biến tuổi . Và đây là những gì chúng ta nhận được sau quá trình tuần tự hóa và giải tuần tự hóa.

#5 Giao diện có thể bên ngoài

Trong Java, khi muốn tùy chỉnh quá trình tuần tự hóa và giải tuần tự hóa, chúng ta có thể sử dụng quy trình chuyển đổi để bỏ qua các biến mà chúng ta không cần cho quá trình tuần tự hóa và giải tuần tự hóa. Một cách khác để đơn giản hóa và cải thiện hiệu suất là sử dụng giao diện Bên ngoài thay vì giao diện Serializable . Hãy xem một ví dụ:
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());
    }
}
Như bạn có thể thấy, khi sử dụng externalizable chúng ta có thể dễ dàng viết logic tùy chỉnh, bỏ qua các biến và đạt hiệu suất tốt hơn so với sử dụng Serializable . Bây giờ hãy nhìn vào đầu ra: Nghỉ giải lao #180.  Các biến trong Java: chúng là gì và chúng được sử dụng như thế nào.  5 điều bạn nên biết về tuần tự hóa và giải tuần tự hóa trong Java - 5

Phần kết luận

Hy vọng rằng qua bài viết này, bạn đã hiểu rõ hơn về cách hoạt động của tuần tự hóa và giải tuần tự hóa trong Java và các ví dụ trên có thể giúp ích cho bạn trong thực tế trong tương lai.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION