Передача объектов параметрами
Давайте сделаем еще и класс EmployeesCollection , который будет хранить массив работников, то есть массив объектов класса Employee .
Пусть работники будут храниться в свойстве employees , а для добавления работников будет существовать метод add . Этот метод параметром будет принимать объект класса Employee и записывать его в конец массива $this->employees :
employees[] = $employee; // $employee — объект класса Employee > > ?>?php>
Давайте также добавим в наш класс метод getTotalSalary , который будет находить суммарную зарплату всех хранящихся работников:
Давайте проверим работу класса EmployeesCollection :
add(new Employee(‘john’, 100)); $employeesCollection->add(new Employee(‘eric’, 200)); $employeesCollection->add(new Employee(‘kyle’, 300)); echo $employeesCollection->getTotalSalary(); // выведет 600 ?>?php>
Давайте сделаем наш класс EmployeesCollection более жизненным и добавим метод получения всех работников и метод подсчета:
employees; > // Подсчитываем количество хранимых работников: public function count() < return count($this->employees); > public function add($employee) < $this->employees[] = $employee; > public function getTotalSalary() < $sum = 0; foreach ($this->employees as $employee) < $sum += $employee->getSalary(); > return $sum; > > ?>?php>
Сделайте класс Product , в котором будут приватные свойства name , price и quantity . Пусть все эти свойства будут доступны только для чтения.
Добавьте в класс Product метод getCost , который будет находить полную стоимость продукта (сумма умножить на количество).
Сделайте класс Cart . Данный класс будет хранить список продуктов (объектов класса Product ) в виде массива. Пусть продукты хранятся в свойстве products .
Реализуйте в классе Cart метод add для добавления продуктов.
Реализуйте в классе Cart метод remove для удаления продуктов. Метод должен принимать параметром название удаляемого продукта.
Реализуйте в классе Cart метод getTotalCost , который будет находить суммарную стоимость продуктов.
Реализуйте в классе Cart метод getTotalQuantity , который будет находить суммарное количество продуктов (то есть сумму свойств quantity всех продуктов).
Реализуйте в классе Cart метод getAvgPrice , который будет находить среднюю стоимость продуктов (суммарная стоимость делить на количество всех продуктов).
Возможно ли передать в метод объект до его инициализации? Java
Возможно ли организовать что-то наподобие этого, чтобы до инициализации передавался экземпляр класса OtherClass в метод method() ?
public class Main < public static void method(Object obj)< obj = new OtherClass(); //code >public static void main(String[] args) < OtherClass oc; method(oc); >>
Если нет, то как поступить в этой ситуации? Ситуация такая, в методе method содержатся switch-case конструкция и в зависимости от выбора case , создавался бы экземпляр класса через его конструктор. Конструктор там перегружен и в зависимости от case вызывалось бы так oc = new OtherClass(30, 10); либо так oc = new OtherClass(); .
Передача объектов в методы
Объекты допускается передавать методам в качестве параметров точно так же, как и примитивные значения. При этом объекты передаются по ссылке на них. Метод может изменять полученные значения. Самый важный вопрос здесь — а будут ли изменяться эти значения в вызвавшем методе? Если в метод передан объект — то будут, если же это примитивное значение — то нет. Почему так? Давайте рассмотрим на следующем примере.
Пример 1. Изменение переданных значений в методе
При запуске программы в стеке выделяется область памяти для метода main(). Там хранятся локальные переменные x и y. При вызове метода changePrimitives() в стеке выделяется еще одна область памяти, в которой создаются локальные переменные, а и b. Их значения хранятся там же. Если, а и b изменяются, это никак не влияет на переменные x и y — они хранятся в разных областях памяти.
Локальная объектная переменная box создается в стековой области памяти метода main(), но сам объект создается в куче. При вызове метода changeObject() передается не сам объект, а ссылка на него. Поэтому при изменении переменной о, в методе changeObject(), меняется объект находящийся куче. И эти изменения, естественно, видны в вызвавшем методе main():
public class Box < double width; double height; double depth; Box(double w, double h, double d) < width = w; height = h; depth = d; >>
public class TestDemo < /** * Изменение объекта * * @param box */ static void changeObject(Box box) < box.width *= 2; box.height /= 2; box.depth += 2; >/** * Изменение примитивных типов * * @param a * @param b */ static void changePrimitives(int a, int b) < a *= 2; b /= 2; >public static void main(String[] args) < Box box = new Box(5, 6, 7); int x = 10; int y = 10; System.out.println("x и y перед вызовом: " + x + " " + y); changePrimitives(x, y); System.out.println("x и y после вызова: " + x + " " + y); System.out.println("box перед вызовом: " + box.width + " " + box.height + " " + box.depth); changeObject(box); System.out.println("box после вызова: " + box.width + " " + box.height + " " + box.depth); >>
x и y перед вызовом: 10 10 x и y после вызова: 10 10 box перед вызовом: 5.0 6.0 7.0 box после вызова: 10.0 3.0 9.0
Объекты можно создавать в методе и возвращать их. Например, как показано в следующем примере:
Пример 2. Возврат объекта из метода
public class ReturnObject < int a; ReturnObject(int i) < a = i; >ReturnObject incrementByTen() < ReturnObject temp = new ReturnObject(a + 10); return temp; >public static void main(String[] args) < ReturnObject ob1 = new ReturnObject(2); ReturnObject ob2 = ob1.incrementByTen(); System.out.println("ob1.a: " + ob1.a); System.out.println("ob2.a: " + ob2.a); >>
- Процедурное и объектно-ориентированное программирование
- Принципы ООП
- Классы и объекты
- Конструктор
- Ключевое слово this
- Перегрузка
- Стек и куча
- Java varargs
- Рекурсия
- Сборщик мусора и метод finalize
- Наследование
- Ключевое слово super
- Модификаторы доступа
- Геттеры и сеттеры
- Переопределение методов
- Абстрактные классы и методы
- Ключевое слово final
- Задания
Как можно передавать в метод объекты разных классов?
Те объекты которые ты хочешь передавать — должны ли они по логике твоей программы иметь общие методы (чтобы воспользоваться ТОЛЬКО ими в методе, в который ты передаешь объект) или ты хочешь передавать совершенно разные объекты?
Update:
смотри, есть такая штука как интерфейс
Например есть 2 класса Cat и Dog. И есть действия которые и тот и другой обязаны делать (по разному) но с определенным результатом. Например это действие — поедание котлет, при этом если есть результат (то он должен быть единообразным) или его быть не должно вовсе (void). Таким образом классы должны выглядеть примерно так (опуская другие вещи)
class Cat < public int eatBeaf(int weight)< //тут описываем съедение return result; //результат - продукт переработки котлет >> class Dog < public int eatBeaf(int weight)< //тут описываем съедение return result; //результат - продукт переработки котлет >>
И допустим у тебя есть Бабуля, которой ты передаешь животное на выходные и она должна будет их кормить периодически. Согласись — бабуле пофигу кто будет пожирать котлеты, она не хочет кормить их по разному, ей важно только то, что бы они ели котлеты и она убирала продукты пищеварения.
Соответственно иметь 2 метода у бабули не хочется:
class GrandMa < public void feedCat(Cat cat)<>public void feedDog(Dog dog)<> >
Вот тут и появляются интерфейсы. Мы видим, что и кот и пес жрут котлеты. Давай скажем что они как животные должны их (котлеты) поедать — это интерфейс.
interface BeafEater < int eatBeaf(int weight); >//и скажем что и кот и пес - пожиратели котлет и они умеют их есть class Cat implements BeafEater < public int eatBeaf(int weight)< //тут описываем съедение return result; //результат - продукт переработки котлет >> class Dog implements BeafEater < public int eatBeaf(int weight)< //тут описываем съедение return result; //результат - продукт переработки котлет >>
Все, теперь бабуля будет рада она будет рассматривать животных как пожирателей котлет, а не как кота или собаку.
class GrandMa < public void feedBeafEater(BeafEater BeafEater)< int weightBeaf = 5; int shit = beafEater.eatBeaf(weightBeaf ); //кормим поедателя котлет, колучаем какахи cleanToilet(shit ); //бабушка убирает какахи >>
Все, просто передаешь в бабушке кота или пса и она их кормит
public static void main(String[] args)< GrandMa grandMa = new GrandMa(); Cat cat = new Cat(); Dog dog = new Dog; //напоминаю и кот и пес - рассматриваются бабушкой как пожиратели котлет, ей важно чтобы они поодерживали определенный интерфейс (умели делать определенные вещи) grandMa.feedBeafEater(cat); grandMa.feedBeafEater(dog); >