Ссылочные типы и объекты
Ссылочные переменные
Простой ссылочный тип
Создание объектов
Операторы
Сравнение ссылок
Присваивание и сравнение ссылок
Изменение значения используя другую ссылку
Передача по ссылке или по значению?
Изменение ссылки
Передача ссылки по значению
Изменение с помощью ссылки
937.46K
Category: programmingprogramming

Типы, переменные, управляющие инструкции. Ссылочные типы и переменные. (Тема 2.3)

1.

II. Типы, переменные,
управляющие инструкции
3. Ссылочные типы и переменные
1

2. Ссылочные типы и объекты

Существует три вида ссылочных типов: типы классов, типы интерфейсов и типы
массивов. Переменные ссылочных типов предназначены для хранения ссылок на
объекты. Можно объявлять свои типы классов и интерфейсов.
Объект – зкземпляр класса или массива. Объекты можно создавать с помощью
оператора new. Оператор new возвращает ссылку на созданный объект. Память для
хранения объектов выделяется в специальной области памяти называемой
управляемой кучей. Память объектов которые уже не будут использоваться
автоматически освобождается с помощью специального процесса который
называется сборка мусора.
2

3. Ссылочные переменные

Class
Class variable
variable [=
[= new
new Class
Class ([param-list])
([param-list]) ];
];
Значением переменной ссылочного типа является ссылка на объект. Переменная типа
класса может использоваться для хранения ссылки на объект класса или на объект класса
потомка. Переменная типа интерфейса может хранить ссылку на объект любого класса
реализующего интерфейс. Перемененная типа массива может хранить ссылку на объект
массива. Значением переменной ссылочного типа может быть специальное значение null
которое не ссылается ни на какой объект. Значение null является значением по умолчанию
для ссылочных типов. При объявлении значение ссылочной переменной может быть
инициализировано.
Класс Object – ссылочный тип который является предком любого другого класса или
массива. Переменная типа класса Object может содержать либо ссылку null, либо ссылку на
любой объект.
3

4.

Cоздание и использование объектов
4

5. Простой ссылочный тип

class
class Employee
Employee {{
Employee(String
Employee(String name,
name, int
int salary)
salary) {{
this.name
this.name == name;
name;
this.salary
this.salary == salary;
salary;
}}
public
public void
void raiseSalary(int
raiseSalary(int byPercent)
byPercent) {{
int
int raise
raise == salary
salary ** byPercent
byPercent // 100;
100;
salary
salary +=
+= raise;
raise;
}}
}}
int
int salary;
salary;
String
String name;
name;
5

6. Создание объектов

public
public class
class NewDemo
NewDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee bob;
bob;
bob
bob == new
new Employee("Robert",
Employee("Robert", 20000);
20000);
Employee
Employee alice
alice == new
new Employee("Alice",
Employee("Alice", 10000);
10000);
}}
}}
System.out.println("Object
System.out.println("Object employee:
employee: name
name == "" ++ bob.name
bob.name ++ ",
", salary
salary == ""
++ bob.salary);
bob.salary);
System.out.println("Object
System.out.println("Object employee:
employee: name
name == "" ++ alice.name
alice.name ++ ",
", salary
salary == ""
++ alice.salary);
alice.salary);
Object
Object
Object
Object
employee:
employee:
employee:
employee:
name
name
name
name
==
==
Robert,
Robert, salary
salary == 20000
20000
Alice,
salary
=
10000
Alice, salary = 10000
6

7.

Операторы
7

8. Операторы

Операторы == и != могут применяться к паре переменных ссылочных типов.
Оператор == возвращает true если две переменные ссылаются на один объект и
false если не ссылаются. Оператор != возвращает true если две ссылочные
переменные не ссылаются на один объект и false если ссылаются.
Оператор = может применяться для того чтобы присвоить значение ссылки
ссылочной переменной.
8

9. Сравнение ссылок

public
public class
class RefEqualityDemo
RefEqualityDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee bob
bob == new
new Employee("Robert",
Employee("Robert", 20000);
20000);
Employee
Employee robert
robert == new
new Employee("Robert",
Employee("Robert", 20000);
20000);
System.out
System.out
.println("Names
.println("Names and
and salaries
salaries are
are equal:
equal: ""
++ ((robert.name.equals(bob.name))
((robert.name.equals(bob.name)) &&
&& (robert.salary
(robert.salary ==
== bob.salary)));
bob.salary)));
}}
}}
System.out.println("References
System.out.println("References are
are equal:
equal: "" ++ (robert
(robert ==
== bob));
bob));
Names
Names and
and salaries
salaries are
are equal:
equal: true
true
References
are
equal:
false
References are equal: false
9

10. Присваивание и сравнение ссылок

public
public class
class AssignDemo
AssignDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee bob
bob == new
new Employee("Robert",
Employee("Robert", 20000);
20000);
Employee
Employee robert
robert == bob;
bob;
System.out
System.out
.println("Names
.println("Names and
and salaries
salaries are
are equal:
equal: ""
++ ((robert.name.equals(bob.name))
((robert.name.equals(bob.name)) &&
&& (robert.salary
(robert.salary ==
== bob.salary)));
bob.salary)));
}}
}}
System.out.println("References
System.out.println("References are
are equal:
equal: "" ++ (robert
(robert ==
== bob));
bob));
Names
Names and
and salaries
salaries are
are equal:
equal: true
true
References
are
equal:
true
References are equal: true
10

11.

Изменение значения используя другую ссылку
11

12. Изменение значения используя другую ссылку

public
public class
class ChangeRefDemo
ChangeRefDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee bob
bob == new
new Employee("Robert",
Employee("Robert", 20000);
20000);
Employee
Employee robert
robert == bob;
bob;
System.out.println("Object
System.out.println("Object employee:
employee: name
name == "" ++ bob.name
bob.name ++ ",
", salary
salary == ""
++ bob.salary);
bob.salary);
System.out.println("Doubling
System.out.println("Doubling salary
salary ...");
...");
robert.raiseSalary(100);
robert.raiseSalary(100);
System.out.println("Object
System.out.println("Object employee:
employee: name
name == "" ++ bob.name
bob.name ++ ",
", salary
salary == ""
++ bob.salary);
bob.salary);
}}
}}
Object
Object employee:
employee: name
name == Robert,
Robert, salary
salary == 20000
20000
Doubling
Doubling salary
salary ...
...
Object
employee:
Object employee: name
name == Robert,
Robert, salary
salary == 40000
40000
12

13.

Cсылочные типы как параметры
13

14. Передача по ссылке или по значению?

Авторы книг по Java продолжают спорить используется ли в Java передача
параметров по ссылке или по значению. Можно говорить что используется передача
объектов по ссылке или что используется передача ссылок по значению. Когда в
качестве параметра в метод передаётся значение ссылочной переменной метод
получает копию ссылки на объект и может изменить состояние объекта но метод не
может изменить ссылку в исходной ссылочной переменной.
14

15.

15

16.

16

17. Изменение ссылки

public
public class
class SwapDemo
SwapDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee
Employee
Employee
alice
alice
bob
bob ==
== new
new Employee("Alice",
Employee("Alice", 20000);
20000);
new
Employee("Robert",
30000);
new Employee("Robert", 30000);
System.out.println("Employee
System.out.println("Employee Alice:
Alice: name
name == "" ++ alice.name
alice.name ++ ",
", salary
salary == "" ++ alice.salary);
alice.salary);
System.out.println("Employee
System.out.println("Employee Bob:
Bob: name
name == "" ++ bob.name
bob.name ++ ",
", salary
salary == "" ++ bob.salary);
bob.salary);
Employee
Employee temp
temp == alice;
alice;
alice
alice == bob;
bob;
bob
bob == temp;
temp;
}}
}}
System.out.println("Employee
System.out.println("Employee
System.out.println("Employee
System.out.println("Employee
Employee
Employee
Employee
Employee
Employee
Employee
Employee
Employee
Alice:
Alice: name
name
Bob:
Bob: name
name ==
Alice:
Alice: name
name
Bob:
Bob: name
name ==
Alice:
Alice: name
name
Bob:
name
Bob: name ==
==
""
""
++
++ alice.name
alice.name ++ ",
", salary
salary
bob.name
+
",
salary
bob.name + ", salary == ""
==
++
"" ++ alice.salary);
alice.salary);
bob.salary);
bob.salary);
== Alice,
Alice, salary
salary == 20000
20000
Robert,
Robert, salary
salary == 30000
30000
== Robert,
Robert, salary
salary == 30000
30000
Alice,
Alice, salary
salary == 20000
20000
17

18. Передача ссылки по значению

public
public class
class NoSwapDemo
NoSwapDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee alice
alice == new
new Employee("Alice",
Employee("Alice", 20000);
20000);
Employee
Employee bob
bob == new
new Employee("Robert",
Employee("Robert", 30000);
30000);
System.out.println("Employee
System.out.println("Employee Alice:
Alice: name
name == "" ++ alice.name
alice.name ++ ",
", salary
salary == "" ++ alice.salary);
alice.salary);
System.out.println("Employee
System.out.println("Employee Bob:
Bob: name
name == "" ++ bob.name
bob.name ++ ",
", salary
salary == "" ++ bob.salary);
bob.salary);
swap(alice,
swap(alice, bob);
bob);
}}
System.out.println("Employee
System.out.println("Employee
System.out.println("Employee
System.out.println("Employee
Alice:
Alice: name
name
Bob:
name
Bob: name ==
==
""
""
++
++ alice.name
alice.name ++ ",
", salary
salary
bob.name
+
",
salary
bob.name + ", salary == ""
==
++
"" ++ alice.salary);
alice.salary);
bob.salary);
bob.salary);
public
public static
static void
void swap(Employee
swap(Employee a,
a, Employee
Employee b)
b) {{
Employee
Employee temp;
temp;
}}
}}
temp
temp == a;
a;
aa == b;
b;
bb == temp;
temp;
Employee
Employee
Employee
Employee
Employee
Employee
Employee
Employee
Alice:
Alice: name
name
Bob:
name
Bob: name ==
Alice:
Alice: name
name
Bob:
Bob: name
name ==
== Alice,
Alice, salary
salary == 20000
20000
Robert,
salary
=
30000
Robert, salary = 30000
== Alice,
Alice, salary
salary == 20000
20000
Robert,
Robert, salary
salary == 30000
30000
18

19. Изменение с помощью ссылки

public
public class
class YesChangeDemo
YesChangeDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee alice
alice == new
new Employee("Alice",
Employee("Alice", 20000);
20000);
System.out.println("Employee
System.out.println("Employee Alice:
Alice: name
name == "" ++ alice.name
alice.name ++ ",
", salary
salary == ""
++ alice.salary);
alice.salary);
DoubleSalary(alice);
DoubleSalary(alice);
}}
System.out.println("Employee
System.out.println("Employee Alice:
Alice: name
name == "" ++ alice.name
alice.name ++ ",
", salary
salary == ""
++ alice.salary);
alice.salary);
public
public static
static void
void DoubleSalary(Employee
DoubleSalary(Employee a)
a) {{
}}
}}
a.raiseSalary(100);
a.raiseSalary(100);
Employee
Employee
Employee
Employee
Alice:
Alice:
Alice:
Alice:
name
name
name
name
==
==
Alice,
Alice,
Alice,
Alice,
salary
salary
salary
salary
==
==
20000
20000
40000
40000
19
English     Русский Rules