JavaRush /Java блог /Random UA /Кава-брейк #180. Змінні Java: що це таке і як вони викори...

Кава-брейк #180. Змінні Java: що це таке і як вони використовуються. 5 речей, які ви повинні знати про серіалізацію та десеріалізацію в Java

Стаття з групи Random UA

Змінні Java: що це таке і як вони використовуються

Джерело: Hackernoon У Java існує чотири різні типи змінних, залежно від того, де вони оголошені в програмі. Сьогодні ви дізнаєтесь приклади та відмінності кожного типу. Кава-брейк #180.  Змінні Java: що це таке і як вони використовуються.  5 речей, які ви повинні знати про серіалізацію та десеріалізацію в Java - 11. Змінні екземпляри (Instance variables) або поля екземпляра (Instance fields) — це змінні, оголошені всередині класу без ключового слова static , але поза методом, конструктором або блоком коду. Такі змінні можуть бути оголошені будь-де всередині класу. Ви можете оголосити їх з модифікатором доступу або без нього, наприклад, public , private , protected або default (не ключове слово).
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
  }
}
Якщо полю екземпляра не присвоюється значення під час оголошення, йому присвоюється значення за умовчанням, рівне нулю, якщо це примітивний тип, наприклад ( int , boolean , long , float ), або null , якщо це примітивний тип, наприклад ( String , Integer , AnyClass ). Вони називаються полями або змінними екземпляром, тому що вони належать екземпляру будь-якого об'єкта, створеного з класу, в якому вони оголошені.
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'
  }
}
Таким чином, кожне поле екземпляра унікальне для свого об'єкта, як видно з наведеного вище фрагмента. У ньому obj1 та obj2 мають унікальні значення, присвоєні їх відповідним полям екземпляра. 2. Поля класу (Class fields) чи статичні поля (static fields) — це поля, оголошені із ключовим словом static . Вони оголошуються всередині класу, але поза методом, конструктором або блоком коду. Вони також можуть бути оголошені в будь-якій позиції всередині класу з модифікатором доступу або без нього, наприклад public , private , protected або default (не ключове слово).
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'
  }
}
Доступ до статичних полів можливий лише через їх класи, а не з будь-якого об'єкта, як показано у фрагменті коду вище. 3. Параметри (Parameters) або змінні-аргументи (Argument variables) - це змінні, оголошені всередині конструкції методу між фігурними дужками сигнатури методу, що відкриваються і і закриваються. Вони використовуються для передачі значень чи об'єктів у метод.
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. Локальні змінні (Local variables) - це змінні, оголошені всередині методу або будь-якого блоку коду, наприклад, всередині блоку операторів if , for loop , while loop , блоку операторів switch і так далі.
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
     }
  }
}
У цьому коді можна помітити використання reference з деякими змінними, тоді як локальна змінна id не згадувалася як посилальна змінна. Будь-яка непримітивна змінна є посилальною змінною. Наприклад, obj1 - це змінна типу MyClass , а tempName - це змінна типу String , і тут обидва типи не є примітивними типами. При цьому id - це змінна типу int , яка є примітивним типом даних. Отже, це непосилкова змінна.

5 речей, які ви повинні знати про серіалізацію та десеріалізацію в Java

Джерело: Devgenius Завдяки цьому посібнику ви покращите свої знання про роботу серіалізації та десеріалізації. Серіалізація Java допомагає перетворити існуючий об'єкт в потік байтів. І навпаки, десеріалізація робить потік байтів об'єктом. Використовуючи серіалізацію та десеріалізацію Java, інформацію про об'єкти можна переносити з однієї JVM на іншу.

#1 Серіалізація

Перш ніж почати докладний опис, звернімо увагу на класи SerializeUtils.java і Person.java . Тут вони нам допоможуть виконати серіалізацію та десеріалізацію на конкретних прикладах.

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;
    }
}
Як згадувалося, серіалізація допомагає перетворити об'єкт на потік байтів. Це означає, що вся інформація про об'єкт також перетворюється на потік байтів, такий як метод, властивості та дані. Ось приклад, як відбувається серіалізація об'єкта:
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");
    }
}
Після процесу серіалізації у нас є файл із таким вмістом: Кава-брейк #180.  Змінні Java: що це таке і як вони використовуються.  5 речей, які ви повинні знати про серіалізацію та десеріалізацію в Java - 2

#2 Десеріалізація

Якщо в попередньому прикладі ми створабо потік байтів через серіалізацію об'єкта, то тепер давайте подивимося, як ми повернемося до об'єкта, використовуючи десеріалізацію:
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());
    }
}
Ось дані після процесу десеріалізації: Кава-брейк #180.  Змінні Java: що це таке і як вони використовуються.  5 речей, які ви повинні знати про серіалізацію та десеріалізацію в Java - 3

#3 Serial Version UID

SerialVersionUID означає унікальний ідентифікаційний номер для кожної версії процесу серіалізації та десеріалізації. Цей номер використовується, щоб переконатися, що серіалізовані та десеріалізовані об'єкти використовують сумісні класи. Для Person.java я хотів би збільшити serialVersionUID до 2. Погляньмо на висновок після десеріалізації файлу person.txt. Кава-брейк #180.  Змінні Java: що це таке і як вони використовуються.  5 речей, які ви повинні знати про серіалізацію та десеріалізацію в Java - 4

#4 Ключове слово Transient

У процесі серіалізації та десеріалізації іноді нам не потрібно серіалізувати всю інформацію про об'єкт. Використовуючи перехідний (transient) процес для змінних, ми можемо ігнорувати ці змінні з об'єкта, що серіалізується. Приклад нижче допоможе зрозуміти це чіткіше:
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());
    }
}
У наведеному вище коді ми використовували ключове слово transient для змінної age . І ось що в нас вийшло після процесу серіалізації та десеріалізації.

#5 Зовнішній інтерфейс (Externalizable Interface)

У Java, коли ми хочемо налаштувати процес серіалізації та десеріалізації, ми можемо використовувати перехідний процес, щоб ігнорувати змінні, які нам не потрібні для процесу серіалізації та десеріалізації. Ще один спосіб спростити та підвищити продуктивність – використовувати інтерфейс Externalizable замість інтерфейсу Serializable . Давайте подивимося на приклад:
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());
    }
}
Як бачите, при використанні Externalizable ми можемо легко написати логіку користувача, ігнорувати змінні і отримати більш високу продуктивність, ніж при використанні Serializable . Тепер давайте подивимося на висновок: Кава-брейк #180.  Змінні Java: що це таке і як вони використовуються.  5 речей, які ви повинні знати про серіалізацію та десеріалізацію в Java - 5

Висновок

Сподіваюся, що завдяки цій статті ви отримали чітке уявлення про те, як серіалізація та десеріалізація працюють у Java, а наведені вище приклади в майбутньому зможуть допомогти вам на практиці.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ