Бесплатный курс по Java: от основ до продвинутого уровня
Ссылочные типы и типы значений в Java
В Java есть два типа данных – ссылочные типы и типы значений.
int, char ,float и т.д это типы значений. Это простые типы. Это просто число либо символ, либо дробное число и т.д. Это не классы (ссылочные типы), которые могут состоять из многих полей типов значений:
public class SomeClass {
int num;
char letter;
float floatingNum;
}
То есть классы могут содержать простые типы типа int,char,float. То есть они сложны так как классы состоят из простых типов значений или также могут содержать в себе другие сложные типы.
Так вот почему же классы ссылочные, а типы значений нет?
Дело в том, что когда мы создаем объект на основе класса с помощью слова new, то в памяти выделяется под него участок и там хранятся значения полей этого объекта.
То есть созданный объект имеет свое состояние в этой области памяти и на эту область памяти можно ссылаться. Можно сказать, что объект это и есть эта область памяти, поэтому можно говорить, что происходит ссылка на объект.
Типы значений же это простые типы они хранят само значение в себе, а не ссылку на участок памяти в котором храниться много разных значений.
Подробнее о ссылках описано в примере далее.
class SomeClass {
int num;
char letter;
double floatingNum;
SomeClass(int num, char letter, double floatingNum) {
// Не по теме данного урока! Но это важно знать.
this.num = num; // this это ссылка на текущий объект класса.
// this на русском это ЭТОТ. То есть ссылка на ЭТОТ
// объект класса. То есть если например мы создаем объект
// на основе класса SomeClass, то в конструкторе
// используется поле num именно ЭТОГО объекта, имеется
// ввиду именно того, который мы создаем.
// Обычно this используется чтобы не происходило
// путаницы с параметрами, так как, как видим, поля класса
// и параметры имеют одинаковые имена.
// То есть присваиваем полю num объекта класса SomeClass,
// значение параметра num переданного в конструктор.
this.letter = letter;
this.floatingNum = floatingNum;
// можно было бы переименовать поля класса или параметры
// тогда можно было бы обойтись без this. Но так лучше
// так как не нужно придумывать разные имена для полей класса
// и параметров.
}
}
public class Types {
public static void main(String[] args) {
// Продемонстрируем пример, чтобы понять что значит ссылаться.
// Создаем два объекта класса SomeClass
// Под каждый объект с помощью new
// выделяется отдельный участок памяти,
// в котором будет храниться его текущее состояние,
// то есть текущие значения его полей.
// То есть сейчас в одном участке памяти
// хранятся значения первого объекта 9, ‘f’, 1.45,
// в другом участке второго объекта 2, ‘k’, 6.11.
SomeClass someClass1 = new SomeClass(9, ‘f’, 1.45);
SomeClass someClass2 = new SomeClass(2, ‘k’, 6.11);
// someClass1 это имя, по которому мы можем
// обращаться к первому объекту, то есть к первому
// участку памяти, то есть someClass1 это ссылка на
// первый объект, а someClass2 это имя, по которому
// мы можем обращаться ко второму объекту,
// то есть ко второму участку памяти, то есть someClass2
// это ссылка на второй объект.
// Присваиваем первый объект второму.
someClass1 = someClass2;
// Что же произойдет? Большинство сразу подумает, что
// в участке памяти первого объекта просто поменяются
// значения полей, хранящиеся в нем, на те, которые
// находятся в участке памяти второго объекта.
// НО ЭТО НЕ ТАК. На самом деле имя, по которому
// можно было обращаться к первому объекту,
// просто перестанет ссылаться на свой участок памяти.
// То есть участок памяти первого объекта
// начнет ссылаться на участок памяти второго объекта.
// Теперь someClass1 и someClass2 — это
// один и тот же объект в памяти (второй объект).
// Просто манипулировать этим объектом в памяти
// теперь можно через разные имена.
// И если теперь мы, например, будем менять значение
// какого-то поля через имя someClass1:
someClass1.num = 10;
// К измененному полю мы также сможем
// обратиться через второе имя объекта.
System.out.println(someClass2.num); // увидим в консоли 10
// Поскольку мы изменили объект, у которого по сути есть
// два имени someClass1 и someClass2,
// имя не важно, мы можем через любое из них
// с ним работать.
// Думаю, теперь понятно, почему они ссылочные.
}
}
Вывод:
Теперь то же самое только с типами значений.
public class Types {
public static void main(String[] args) {
//Типы значений же это простые типы
//они хранят само значение в себе,
//а не ссылку на участок памяти.
//По аналогии с тем что сверху только с простыми типами.
int A=4, B=12;
A = B;
A = 6;
System.out.println(B);
//B все еще 12 в отличии от A, которая содержит 6
//так как сначала мы просто изменили значение в A
//на значение которое в B,
//а потом изменили значение в A на значение 6.
//На значение в B действия с A никак не влияют.
}
}
Узнайте, что такое аннотации в Java на примерах @Override, @Deprecated и @FunctionalInterface. Создавайте собственные аннотации с @interface для управления кодом.
Time to read: 12
Обработка исключений
Освойте обработку исключений в Java: try-catch-finally, throw и throws. Узнайте, как предотвратить аварийное завершение программы при ошибках.