Змінні Java: що це таке і як вони використовуються
Джерело: Hackernoon У Java існує чотири різні типи змінних, залежно від того, де вони оголошені в програмі. Сьогодні ви дізнаєтесь приклади та відмінності кожного типу. 1. Змінні екземпляри (Instance variables) або поля екземпляра (Instance fields) — це змінні, оголошені всередині класу без ключового слова static , але поза методом, конструктором або блоком коду. Такі змінні можуть бути оголошені будь-де всередині класу. Ви можете оголосити їх з модифікатором доступу або без нього, наприклад, public , private , protected або default (не ключове слово).
Якщо полю екземпляра не присвоюється значення під час оголошення, йому присвоюється значення за умовчанням, рівне нулю, якщо це примітивний тип, наприклад ( int , boolean , long , float ), або null , якщо це примітивний тип, наприклад ( String , Integer , AnyClass ). Вони називаються полями або змінними екземпляром, тому що вони належать екземпляру будь-якого об'єкта, створеного з класу, в якому вони оголошені.
publicMain{publicstaticvoidmain(String[] args){MyClass obj1 =newMyClass();MyClass obj2 =newMyClass();//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 (не ключове слово).
publicclassMyClass{//static fieldpublicstaticString staticField;publicMyClass(){}//Constructor}classMain{publicstaticvoidmain(String[] args){MyClass obj =newMyClass();
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) - це змінні, оголошені всередині конструкції методу між фігурними дужками сигнатури методу, що відкриваються і і закриваються. Вони використовуються для передачі значень чи об'єктів у метод.
publicclassMyClass{//instance fieldpublicString instanceField;publicMyClass(){}//Constructor//instance method with a parameter variablepublicvoidsetInstanceField(String parameterVariable){
instanceField = parameterVariable;}}classMain{publicstaticvoidmain(String[] args){MyClass obj =newMyClass();
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 і так далі.
publicMain{publicstaticvoidmain(String[] args){MyClass obj1 =newMyClass();// 'obj1' is local reference variableint 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
packagecom.techteam.serialization;importjava.io.*;publicclassSerializeUtils{publicstatic<T>voidserialize(T input,String fileName)throwsIOException{FileOutputStream file =newFileOutputStream(fileName);ObjectOutputStream out =newObjectOutputStream(file);
out.writeObject(input);
out.close();
file.close();}publicstatic<T>Tdeserialize(String fileName)throwsIOException,ClassNotFoundException{FileInputStream file =newFileInputStream(fileName);ObjectInputStream in =newObjectInputStream(file);T result =(T) in.readObject();return result;}publicstaticvoidexternalSeialize(Externalizable e,String fileName)throwsIOException{FileOutputStream file =newFileOutputStream(fileName);ObjectOutputStream out =newObjectOutputStream(file);
e.writeExternal(out);
out.close();
file.close();}publicstaticvoidexternalDeseialize(Externalizable e,String fileName)throwsIOException,ClassNotFoundException{FileInputStream file =newFileInputStream(fileName);ObjectInputStream in =newObjectInputStream(file);
e.readExternal(in);
in.close();
file.close();}}
Як згадувалося, серіалізація допомагає перетворити об'єкт на потік байтів. Це означає, що вся інформація про об'єкт також перетворюється на потік байтів, такий як метод, властивості та дані. Ось приклад, як відбувається серіалізація об'єкта:
packagecom.techteam.serialization;importjava.io.IOException;publicclassSerializationMain{publicstaticvoidmain(String[] args)throwsIOException{Person p =newPerson();
p.setId(1);
p.setName("Tech team members");
p.setAge(20);SerializeUtils.serialize(p,"/person.txt");}}
Після процесу серіалізації у нас є файл із таким вмістом:
#2 Десеріалізація
Якщо в попередньому прикладі ми створабо потік байтів через серіалізацію об'єкта, то тепер давайте подивимося, як ми повернемося до об'єкта, використовуючи десеріалізацію:
packagecom.techteam.serialization;importjava.io.IOException;publicclassDeserializationMain{publicstaticvoidmain(String[] args)throwsIOException,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());}}
Ось дані після процесу десеріалізації:
#3 Serial Version UID
SerialVersionUID означає унікальний ідентифікаційний номер для кожної версії процесу серіалізації та десеріалізації. Цей номер використовується, щоб переконатися, що серіалізовані та десеріалізовані об'єкти використовують сумісні класи. Для Person.java я хотів би збільшити serialVersionUID до 2. Погляньмо на висновок після десеріалізації файлу person.txt.
#4 Ключове слово Transient
У процесі серіалізації та десеріалізації іноді нам не потрібно серіалізувати всю інформацію про об'єкт. Використовуючи перехідний (transient) процес для змінних, ми можемо ігнорувати ці змінні з об'єкта, що серіалізується. Приклад нижче допоможе зрозуміти це чіткіше:
У наведеному вище коді ми використовували ключове слово transient для змінної age . І ось що в нас вийшло після процесу серіалізації та десеріалізації.
#5 Зовнішній інтерфейс (Externalizable Interface)
У Java, коли ми хочемо налаштувати процес серіалізації та десеріалізації, ми можемо використовувати перехідний процес, щоб ігнорувати змінні, які нам не потрібні для процесу серіалізації та десеріалізації. Ще один спосіб спростити та підвищити продуктивність – використовувати інтерфейс Externalizable замість інтерфейсу Serializable . Давайте подивимося на приклад:
Як бачите, при використанні Externalizable ми можемо легко написати логіку користувача, ігнорувати змінні і отримати більш високу продуктивність, ніж при використанні Serializable . Тепер давайте подивимося на висновок:
Висновок
Сподіваюся, що завдяки цій статті ви отримали чітке уявлення про те, як серіалізація та десеріалізація працюють у Java, а наведені вище приклади в майбутньому зможуть допомогти вам на практиці.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ