Java как передать класс в качестве параметра
Объекты классов, как и данные примитивных типов, могут передаваться в методы. Однако в данном случае есть одна особенность — при передаче объектов в качестве значения передается копия ссылки на область в памяти, где расположен этот объект. Рассмотрим небольшой пример. Пусть у нас есть следующий класс Person:
public class Program < public static void main(String[] args) < Person kate = new Person("Kate"); System.out.println(kate.getName()); // Kate changeName(kate); System.out.println(kate.getName()); // Alice >static void changeName(Person p) < p.setName("Alice"); >> class Person < private String name; Person(String name)< this.name = name; >public void setName(String name) < this.name = name; >public String getName() < return this.name; >>
Здесь в метод changeName передается объект Person, у которого изменяется имя. Так как в метод будет передаваться копия ссылки на область памяти, в которой находится объект Person, то переменная kate и параметр p метода changeName будут указывать на один и тот же объект в памяти. Поэтому после выполнения метода у объекта kate, который передается в метод, будет изменено имя с «Kate» на «Alice».
От этого случая следует отличать другой случай:
public class Program < public static void main(String[] args) < Person kate = new Person("Kate"); System.out.println(kate.getName()); // Kate changePerson(kate); System.out.println(kate.getName()); // Kate - изменения не произошло // kate хранит ссылку на старый объект >static void changePerson(Person p) < p = new Person("Alice"); // p указывает на новый объект p.setName("Ann"); >static void changeName(Person p) < p.setName("Alice"); >> class Person < private String name; Person(String name)< this.name = name; >public void setName(String name) < this.name = name; >public String getName() < return this.name; >>
В метод changePerson также передается копия ссылки на объект Person. Однако в самом методе мы изменяем не отдельные значения объекта, а пересоздаем объект с помощью конструктора и оператора new. В результате в памяти будет выделено новое место для нового объекта Person, и ссылка на этот объект будет привоена параметру p:
static void changePerson(Person p) < p = new Person("Alice"); // p указывает на новый объект p.setName("Ann"); // изменяется новый объект >
То есть после создания нового объекта Person параметр p и переменная kate в методе main будут хранить ссылки на разные объекты. Переменная kate, которая передавалась в метод, продолжит хранить ссылку на старый объект в памяти. Поэтому ее значение не меняется.
Как передать класс объекта в качестве параметра?
Так как здесь много однообразной работы (вызов activity), то хотелось бы оптимизировать. Что-то вроде этого:
public void classUsing (String s) < Intent intent = new Intent(this, s.class); startActivity(intent); >@Override public void onClick(View v) < switch (v.getId()) < case R.id.btnGallery: classUsing(ClassName1); break; case R.id.btnNew: classUsing(ClassName2); break; case R.id.btnPrice: classUsing(ClassName3); break; . >>
Как передать название класса в виде аргумента в другой метод и там его использовать?
Отслеживать
19.1k 6 6 золотых знаков 30 30 серебряных знаков 44 44 бронзовых знака
задан 12 июл 2016 в 10:23
user208111 user208111
115 2 2 серебряных знака 9 9 бронзовых знаков
Можно было просто startActivity(intent) вынести за кейсы и все. Будет намного лаконичней, чем писать отдельный метод.
12 июл 2016 в 17:07
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
.class имеет тип Class . Вы можете передать в метод класс как параметр таким образом:
public void doSomething(Class clazz)
doSomething(Class1.class);
Отслеживать
ответ дан 12 июл 2016 в 10:27
Vladyslav Matviienko Vladyslav Matviienko
20.4k 3 3 золотых знака 30 30 серебряных знаков 52 52 бронзовых знака
Спасибо, а как собственно передать название класса? т.к case R.id.btnGallery: classUsing(ClassName); break; вызывает ошибку
12 июл 2016 в 10:34
@user208111 classUsing(ClassName.class);
12 июл 2016 в 10:39
Спасибо за помощь. =)
12 июл 2016 в 10:40
- java
- android
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как передать класс в метод java
Чтобы передать класс в метод Java , нужно использовать его имя как параметр.
public class MyClass public void myMethod(Class parameterClass) // Тело метода > > // Использование метода MyClass myClass = new MyClass(); myClass.myMethod(String.class);
В данном примере мы передаем класс String в качестве параметра в метод myMethod
Передача метода в качестве параметра в Java
Проблема передачи метода в качестве параметра в Java весьма распространена среди новичков. Во многих других языках программирования, таких как JavaScript или Python, это довольно просто реализуется. Однако, в Java этого сделать нельзя напрямую. Вместо этого, используется концепция интерфейсов.
Допустим, есть код, который вызывает метод для каждого элемента в массиве компонентов. Этот метод может изменять цвет или размер компонентов, или делать с ними что-то еще. В Java это можно реализовать с помощью интерфейса с единственным методом.
public interface Action
Этот интерфейс может быть реализован в любом классе, который изменяет компоненты определенным образом.
public class ChangeColorAction implements Action < @Override public void execute(Component component) < // код для изменения цвета >> public class ChangeSizeAction implements Action < @Override public void execute(Component component) < // код для изменения размера >>
Теперь, вместо метода, нужно передавать экземпляр класса, который реализует интерфейс Action .
public void setAllComponents(Component[] myComponentArray, Action action) < for (Component component : myComponentArray) < if (component instanceof Container) < setAllComponents(((Container)component).getComponents(), action); >action.execute(component); > >
И вызов этого метода будет выглядеть так:
setAllComponents(this.getComponents(), new ChangeColorAction()); setAllComponents(this.getComponents(), new ChangeSizeAction());
Таким образом, в Java для передачи метода как параметра применяются интерфейсы. Интерфейс определяет требуемый метод, и вместо передачи метода передается объект, реализующий этот интерфейс. Это позволяет обеспечить гибкость и повторное использование кода, поскольку разные реализации интерфейса могут быть переданы в качестве параметра.