Как обратиться к объектам другого класса
Подскажите, как в языке программирования Java SE 6 можно обратиться к объекту другого класса (в моём случае — к кнопке из другого фрейма)?
И как изменить текст на кнопке? (это для проверки правильности моего алгоритма).
Лучший ответ
Можно конечно сделать кнопку публичной, но управлять классом извне напрямую считается плохим тоном, поэтому следует просто либо задавать эти данные через конструктор, либо через метод. А вообще, не вижу смысла обзывать кнопки в другом классе. Не надо превращать код в свалку.
Остальные ответы
Неужели в твоей программе нет ни одного обращения к объектам другого класса? Это приложение «Hello world»?
Элементарно. Через точку: sameObject.aMetod() или sameObject.aField
Вызываемый метод или поле должно быть public.
Максим ПророченкоУченик (151) 6 лет назад
и на фига мне делать несколькофреймовый хеллоу ворлд?
Голова Робота Просветленный (36278) Если в программе нет ни одного обращения к объектам другого класса, это может быть только «Hello world». Или несколько фреймов «Hello world»-а 🙂
самый пряморукий способ — передать обьект другого класса в конструкторе
protected кнопка
public конструктор ( Кропка кропка) this. кнопка = кнопка;
>
и делаешь с этой переменной что хочешь
или то же самое в sette-ре.
для переименования кнопки пряморуким способом является обьявление listenera на какое то событие, в ходе которого этот листенер меняет текст на кнопке, листенеру следует передавать обьект кнопки как описано выше в конструкторе.
Менее пряморукие способы имхо:
— сделать обьект статическим
— сохранить обьект в статической хеш таблице objects < String, Object>
— сделать статический метод static changeButton ( твой, обьект, кнопка)
— вывернуть код на изнанку visitor-ом, то есть тогда «кнопка» будет знать про этот класс
Или передать объект одного класса в нужный метод другого в качестве параметра
«объекты другого класса».
ты понимаешь что «класс» это тоже «объект»? да?
Максим ПророченкоУченик (151) 6 лет назад
видишь пример? или ты прочитал предложение перед ним и сразу ответ настрочил?
Вы, вероятно, оговорились. Не к объектам, а к содержимому контейнера. Фрейм — контейнер. Вы же сами в него положили кнопку, когда писали add. Элементы контейнера — перечислимые, то есть их можно хоть по очереди доставать, хоть по индексу, хоть по ключу.
Максим ПророченкоУченик (151) 6 лет назад
а точнее можно? так пойдёт: фрейм. кнопка = кнопка (новый текст)?
Юрий Семыкин Искусственный Интеллект (174095) Так не нужно (хотя можно класс. фрейм. и один из методов: getComponent(int №) – возвращает компонент с указанным порядковым номером; getComponents() – возвращает все компоненты в виде массива; getComponentCount() – возвращает количество компонент; getComponentAt(int x, int y) или getComponentAt( Point p ) – возвращает компонент, который включает в себя указанную точку; findComponentAt(int x, int y) или findComponentAt( Point p ) – возвращает видимый компонент, включающий в себя указанную точку.). Вариант надёжнее и проще: Сделайте метод внутри класса (где вы хотите кнопку переименовывать) смены текста на кнопке и вызывайте. Похоже, что и так не нужно — вы плохо продумали задачу.
По хорошему, тот фрейм который владеет кнопкой должен иметь паблик метод, типа setText_ButtonStart(String text)
Как обратиться из одного объекта к переменной другого объекта?
Как обратиться из одного объекта к переменной другого объекта?
public class Solution int a = 555; public void show() System.out.println(object2.a); //здесь ошибка. Что не так? > public static void main(String[] args) Solution object1 = new Solution(); Solution object2 = new Solution(); object1.show(); > >
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Уровень 31
28 апреля 2019, 10:21 решение
переменная object2 видна только внутри метода, где она объявлена, те в методе main. если ты хочешь использовать переменную объекта, который находится внутри переменной object2, в другом методе, ее можно передать через аргументы
Уровень 16
28 апреля 2019, 10:27
Как именно это сделать, на примере моего кода?
Константин Кшнякин Backend Developer
28 апреля 2019, 10:43 решение
Не знаю в чем смысл задачи.Если в передачи переменной то:
public void show() // "()" - это аргументные скобки.Сюда указывается входящий парамерт. // Пример: public void show(String s), где String - тип переменной, а // s - имя переменной. System.out.println(object2.a); // В этих скобках необходимо указать имя перемной > object1.show(); - в этих скобка необходимо указать передаваемый параметр
Уровень 16
28 апреля 2019, 11:11
public class Solution int a = 555; public void show(Solution j) System.out.println(j.a); > public static void main(String[] args) Solution object1 = new Solution(); Solution object2 = new Solution(); object2.a = 111; object1.show(object2); > > //Вывод: 111
Константин Кшнякин Backend Developer
28 апреля 2019, 13:03
Какое задание?что надо сделать?
Уровень 16
28 апреля 2019, 13:06
это просто вопрос, он решён, спасибо
Константин Кшнякин Backend Developer
28 апреля 2019, 13:20
Старайся решать задачи более осознано.Пользуйся дебагером, чтобы понимать как получается результат. Меня немного ввело в ступр уведенное. Можно было сделать проще. Вот так:
public class Solution public void show(int j) System.out.println(j); > public static void main(String[] args) Solution object2 = new Solution(); object2.show(111); > >
Или вот так:
public class Solution static int a = 111; public void show(int j) System.out.println(j); > public static void main(String[] args) Solution object2 = new Solution(); object2.show(a); > >
Вложенные и внутренние классы
Определение класса может размещаться внутри определения другого класса. Такие классы называются вложенными или внутренними. Область видимости вложенного класса ограничена областью видимости внешнего класса. Поэтому, если вы создадите класс B внутри класса A, то класс B не сможет существовать независимо от класса A.
Вложенные классы позволяют группировать классы, логически принадлежащие друг другу, и управлять доступом к ним.
Существуют два типа вложенных класса — статические и нестатические.
Вложенные классы
Если связь между объектом внутреннего класса и объектом внешнего класса не нужна, можно сделать внутренний класс статическим (static). Такой класс называют вложенным (nested).
Применение статического внутреннего класса означает следующее:
- для создания объекта статического внутреннего класса не нужен объект внешнего класса
- из объекта вложенного класса нельзя обращаться к нестатическим членам внешнего класса
Вложенный класс имеет доступ к членам своего внешнего класса, в том числе и к закрытым членам. Однако, внешний класс не имеет доступа к членам вложенного класса. Вложенный класс при этом является членом внешнего класса.
Статический класс объявляется ключевым словом static. При этом класс должен обращаться к нестатическим членам своего внешнего класса при помощи объекта, т.е. он не может обращаться напрямую на нестатические члены своего внешнего класса. На практике подобные классы используются редко.
// внешний класс class outerClassName < private static class innerClassName < // тело вложенного класса >>
Внутренние классы
Нестатические вложенные классы называют также внутренними классами (inner). Внутренний класс имеет доступ ко всем переменным и методам своего внешнего класса и может непосредственно ссылаться на них.
Внутренние классы создаются внутри окружающего класса:
// внешний класс class Outer < int outer_x = 9; void test() < Inner inner = new Inner(); inner.display(); >// внутренний класс class Inner < void display() < Log.i(TAG, outer_x); >> > class MainActivity. < // В методе onCreate() активности Outer outer = new Outer(); outer.test(); >
Внутренний класс Inner определён в области видимости класса Outer. Поэтому любой код в классе Inner может непосредственно обращаться к переменной outer_x. Когда мы создаём экземпляр класса Outer и вызываем метод test(), то создаём также экземпляр класса Inner с вызовом метода display().
Кстати говоря, внутренний класс можно определить не только на уровне класса, но и внутри метода или внутри тела цикла.
Если понадобится создать объект внутреннего класса не в статическом методе внешнего класса, тип этого объекта должен задаваться в формате ИмяВнешнегоКласса.ИмяВнутреннегоКласса.
Объект внутреннего класса связан с внешним объектом-создателем и может обращаться к его членам без каких-либо дополнительных описаний. Для внутренних классов доступны все элементы внешнего класса.
Если вам понадобится получить ссылку на объект внешнего класса, запишите имя внешнего класса, за которым следует точка, а затем ключевое слово this.
Анонимные классы
Существует разновидность внутреннего класса, которая называется анонимным классом, так как у него нет имени. Подобные классы очень часто встречаются в примерах на Android. Например, когда вы пишете код для щелчка или других событий.
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() < @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) < >@Override public void onStartTrackingTouch(SeekBar seekBar) < >@Override public void onStopTrackingTouch(SeekBar seekBar) < >>);
В этом коде вы используете конструкцию new SeekBar.OnSeekBarChangeListener(), но обходитесь без создания переменной для этого класса.
Получение доступа к закрытым методам класса извне на Java
Вы можете получить доступ к закрытым методам класса извне класса с использованием пакета в Java.
- Создайте экземпляр класса Method пакета java.lang.reflect, передав имя метода, который объявлен как private.
- Установите доступный метод, передав значение true методу setAccessible().
- Наконец, вызовите метод, используя метод invoke().
Пример
import java.lang.reflect.Method; public class DemoTest < private void sampleMethod() < System.out.println("hello"); >> public class SampleTest < public static void main(String args[]) throws Exception < Class c = Class.forName("DemoTest"); Object obj = c.newInstance(); Method method = c.getDeclaredMethod("sampleMethod", null); method.setAccessible(true); method.invoke(obj, null); >>
Средняя оценка 0 / 5. Количество голосов: 0
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.