
- •Основы классов
- •Общая форма класса
- •Простой класс
- •Объявление объектов
- •Операция new
- •Представление методов
- •Добавление метода к классу Box
- •Возврат значений
- •Добавление метода с параметрами
- •Конструкторы
- •Параметризованные конструкторы
- •Ключевое слово this
- •Скрытие переменной экземпляра
- •Сборка "мусора"
- •Метод finalize()
- •Класс Stack
- •Перегрузка конструкторов
- •Использование объектов в качестве параметров
- •Передача аргументов
- •Возврат объектов
- •Рекурсия
- •Управление доступом
- •Статические элементы
- •Спецификатор final
- •Ревизия массивов
- •Вложенные и внутренние классы
- •Класс String
- •Использование аргументов командной строки
- •Наследование
- •Основы наследования
- •11 Тело класса }
- •Доступ к элементам и наследование
- •Практический пример
- •Переменная суперкласса может ссылаться на объект подкласса
- •Использование ключевого слова super
- •Вызов конструктора суперкласса с помощью первой формы super
- •Создание многоуровневой иерархии
- •II построить клон объекта
- •Когда вызываются конструкторы
- •Переопределение методов
- •Динамическая диспетчеризация методов
- •Зачем нужны переопределенные методы?
- •Применение переопределения методов
- •Использование абстрактных классов
- •Void meth() { // ошибка! Нельзя переопределять.
- •Класс Object
Передача аргументов
Вообще, существуют два способа, с помощью которых машинный язык может передавать аргумент подпрограмме. Первый способ – передача аргумента по значению. Этот метод копирует значение аргумента в формальный параметр подпрограммы. Поэтому любые изменения этого параметра подпрограммой не имеют никакого влияния на соответствующий аргумент вызова. Второй способ – передача аргумента по ссылке. В этом методе ссылка на параметр (а не его, значение) передается параметру. Внутри подпрограммы она используется, чтобы обратиться к фактическому параметру, указанному в вызове. Это означает, что изменения параметра будут влиять на аргумент, использованный для вызова подпрограммы. Java использует оба метода, в зависимости от того, что передается во время вызова подпрограмме.
Когда методу передается простой тип, он передается по значению. Таким образом, то, что происходит с параметром, который принимает аргумент, никак не влияет на сам аргумент (т. е. аргумент при этом не изменяется). Например, рассмотрим следующую программу:
// Простые типы передаются по значению.
class Test {
void meth(int i, int j) {
i *= 2;
j /= 2;
}
}
class CallByValue {
public static void main(String args[]) {
Test ob = new Test();
int a = 15, b = 20;
System.out.println("а и b перед вызовом: " + a + " " + b);
ob.meth(a, b);
System.out.println("а и b после вызова: " + a + " " + b);
}
}
Вывод этой программы:
а и b перед вызовом: 15 20
а и b после вызова: 15 20
Как видите, операции, 'которые происходят внутри meth(), никак не влияют на значения а и ь, используемые в вызове (их значения здесь не изменялись до 30 и 10, хотя метод meth() и выполнил соответствующие вычисления над своими параметрами).
Когда вы передаете методу объект, ситуация драматически изменяется, потому что объекты передаются по ссылке. Имейте в виду, что при создании переменной типа "класс", вы создаете только ссылку на объект. Таким образом, когда вы передаете эту ссылку методу, принимающий ее параметр будет ссылаться на тот же самый объект, что и аргумент. Это и означает, что объекты передаются методам по ссылке. Все изменения объекта внутри метода затрагивают объект, используемый как аргумент. Например, рассмотрим следующую программу:
// Объекты передаются по ссылке.
class Test {
int a, b;
Test(int i, int j) {
b = j;
}
// передать объект
void meth(Test o) {
o.a *= 2;
o.b /= 2;
}
}
class CallByRef {
public static void main (String args [ ] ) {
Test ob = new Test (15, 20);
System.out.println ("ob.а и ob.b перед вызовом: " + ob.a + " " + ob.b);
ob.meth (ob);
System.out.println ("ob.a и ob.b после вызова: " + ob.a + " " + ob.b);
}
}
Эта программа генерирует следующий вывод:
ob.a и ob.b перед вызовом: 15 20
ob.a и ob.b после вызова: 30 10
Не трудно заметить, что в этом случае действия внутри meth() воздействовали на объект, используемый как аргумент.
Интересно отметить, что при передаче объектной ссылки методу сама ссылка передается по значению. Однако, т. к. передаваемое значение ссылается на объект, копия этого значения будет ссылаться на тот же объект, что и соответствующий аргумент.
Простые типы передаются методу по значению, а объекты – по ссылке.