Переменные в 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, а приведенные выше примеры в будущем смогут помочь вам на практике.
+9
Комментарии (2)
популярные
новые
старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Привет.
«3. Параметры (Parameters) или переменные-аргументы (Argument variables) — это переменные, объявленные внутри конструкции метода между открывающимися и и закрывающимися фигурными скобками сигнатуры метода. Они используются для передачи значений или объектов в метод.»
Действительно ли объявление параметра (переменного-аргумента) происходит между фигурными скобками внутри конструкции метода? Или всё же параметр объявляется между круглыми скобками после названия метода?
В пункте #4 Ключевое слово Transient, скриншот с выводом результата находится в #5 Внешний интерфейс (Externalizable Interface) и соответственно результат выполнения #5 пункта отсутствует.