Перейти к содержимому

Java как передать класс в качестве параметра

  • автор:

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 для передачи метода как параметра применяются интерфейсы. Интерфейс определяет требуемый метод, и вместо передачи метода передается объект, реализующий этот интерфейс. Это позволяет обеспечить гибкость и повторное использование кода, поскольку разные реализации интерфейса могут быть переданы в качестве параметра.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *