Подключение метода из другого класса
как в строке jTextPane1 подключить (реализовать) check_connect(), читал статью про подключение библиотек классов, но боюсь если пойду этим путем загребу в дебри.
Если я этот метод check_connect() буду прописывать в самом теле
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
то код будет ооочень большим и можно потеряться.
К примеру на php есть function, отдельно прописал функции и includом в тело пхп вставил, как это тут реализовать запутался.
Спасибо
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Вызов метода из другого класса
Собственно не получается вызвать метод из класса math public class math < int.
Вызов метода из другого класса
Здравствуйте, подскажите как можно создать два класса так, чтобы из второго вызывался метод первого?
Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна.
Не изменятся переменная из метода другого класса help
Здравствуйте.Имеется проблема с переменными.Есть классы Brain и Home.В Brain имеются переменные.
Am I evil? Yes, I am!
![]()
![]()
16120 / 9755 / 2731
Регистрация: 21.10.2017
Сообщений: 21,624
Если у тебя метод check_connect не статический, в классе Check создаешь объект Check_void x = new Check_void(); и, где надо, вызываешь его метод x.check_connect();
Регистрация: 13.11.2017
Сообщений: 21
я тоже самое делал new Chek_void().check_connect();
в консоли работает, как вызвать этот метод в jTextPane1?
Am I evil? Yes, I am!
![]()
![]()
16120 / 9755 / 2731
Регистрация: 21.10.2017
Сообщений: 21,624
Сообщение от Str-137 
как вызвать этот метод в jTextPane1?
В смысле, вывести результат выполнения метода?
Регистрация: 13.11.2017
Сообщений: 21
Am I evil? Yes, I am!
![]()
![]()
16120 / 9755 / 2731
Регистрация: 21.10.2017
Сообщений: 21,624
Ну, если метод возвращает что-нибудь, то просто
String str = (new Chek_void().check_connect()).toString(); jTextPane1.setText(str);
Добавлено через 1 минуту
Сообщение от Str-137 
в консоли работает
он у тебя, походу, просто в консоль что-то выводит?
Регистрация: 13.11.2017
Сообщений: 21
В консоль он у меня выводит реализацию этого :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
void check_connect(){ Connection con = null; Statement st = null; ResultSet rs= null; try { con = DriverManager.getConnection("jdbc:h2:~/test/test","sa",""); st = con.createStatement(); String s = "SELECT * FROM TEST_1 ORDER BY RAND() LIMIT 5"; // String s = "SELECT * FROM TEST_1 WHERE "; rs = st.executeQuery(s); while(rs.next()){ System.out.println(rs.getString(1)+" "+rs.getString(2)+" " +rs.getString(3)+" "+rs.getString(4)+" "+rs.getString(5)+" "+rs.getString(6)); } } catch(Exception e) { JOptionPane.showMessageDialog(null, "ERROR"); }finally { try { st.close(); rs.close(); con.close(); } catch(Exception e) { JOptionPane.showMessageDialog(null, "ERROR CLOSE"); } } } }
Добавлено через 1 минуту
а мне нужно, что бы при нажатии кнопки, содержимое запроса SELECT вышел в поле jTextPane1
Добавлено через 1 минуту
Сообщение от iSmokeJC 
Использование методов другого класса

Так вот, есть задача — создать некоторое количество тестов, у которых будет общая часть, а именно — авторизация на сайте. Без нее ни один тест невозможно осуществить. Чтобы не прописывать это каждый раз в каждом новом тесте, мне нужно эту общую часть вынести в отдельный класс, откуда необходимо брать методы и т.д. Так вот, не мог бы кто-нибудь подсказать, как это можно реализовать?
Наследование просили не делать. Хотя у меня и с ним не получилось, т.к. навыков программирования нет (успел только 1 главу одной книги по Java прочитать быстро).
Вот как выглядит авторизация сейчас:
package utils; import java.util.regex.Pattern; import java.util.concurrent.TimeUnit; import org.junit.*; import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.Select; public class Login < public WebDriver driver; public String baseUrl; @Before public void setUp() throws Exception < driver = new FirefoxDriver(); baseUrl = "http://sys.it-co.ru:7077/"; driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); >@Test public void authentication() throws Exception < driver.get(baseUrl + "/DBudgeting/"); driver.findElement(By.id("ctlLogin_textBoxLogin")).clear(); driver.findElement(By.id("ctlLogin_textBoxLogin")).sendKeys("admin"); driver.findElement(By.id("ctlLogin_textBoxPassword")).clear(); driver.findElement(By.id("ctlLogin_textBoxPassword")).sendKeys("admin"); driver.findElement(By.id("ctlLogin_btnLogin")).click(); >>
Чтение значения «частных» полей из другого класса в Java
В этом кратком руководстве мы обсудим, как мы можем получить доступ к значению частного поля из другого класса в Java.
Прежде чем приступить к руководству, нам нужно понять, что модификатор закрытого доступа предотвращает случайное неправильное использование полей. Однако, если мы хотим получить к ним доступ, мы можем сделать это с помощью Reflection API.
2. Пример
Давайте определим пример класса Person с некоторыми приватными полями:
public class Person private String name = "John"; private byte age = 30; private short uidNumber = 5555; private int pinCode = 452002; private long contactNumber = 123456789L; private float height = 6.1242f; private double weight = 75.2564; private char gender = 'M'; private boolean active = true; // getters and setters >
3. Обеспечение доступа к приватным полям
Чтобы сделать любое приватное поле доступным, мы должны вызвать метод Field#setAccessible :
Person person = new Person(); Field nameField = person.getClass().getDeclaredField("name"); nameField.setAccessible(true);
В приведенном выше примере мы сначала указываем поле, которое мы хотим получить — имя — с помощью метода Class#getDeclaredField . Затем мы делаем поле доступным, используя nameField.setAccessible(true) .
4. Доступ к частным примитивным полям
Мы можем получить доступ к закрытым полям, которые являются примитивами, используя методы Field#getXxx .
4.1. Доступ к целочисленным полям
Мы можем использовать методы getByte, getShort , getInt и getLong для доступа к полям byte , short , int и long соответственно:
@Test public void whenGetIntegerFields_thenSuccess() throws Exception Person person = new Person(); Field ageField = person.getClass().getDeclaredField("age"); ageField.setAccessible(true); byte age = ageField.getByte(person); Assertions.assertEquals(30, age); Field uidNumberField = person.getClass().getDeclaredField("uidNumber"); uidNumberField.setAccessible(true); short uidNumber = uidNumberField.getShort(person); Assertions.assertEquals(5555, uidNumber); Field pinCodeField = person.getClass().getDeclaredField("pinCode"); pinCodeField.setAccessible(true); int pinCode = pinCodeField.getInt(person); Assertions.assertEquals(452002, pinCode); Field contactNumberField = person.getClass().getDeclaredField("contactNumber"); contactNumberField.setAccessible(true); long contactNumber = contactNumberField.getLong(person); Assertions.assertEquals(123456789L, contactNumber); >
Также возможно выполнить автоупаковку с примитивными типами:
@Test public void whenDoAutoboxing_thenSuccess() throws Exception Person person = new Person(); Field pinCodeField = person.getClass().getDeclaredField("pinCode"); pinCodeField.setAccessible(true); Integer pinCode = pinCodeField.getInt(person); Assertions.assertEquals(452002, pinCode); >
Методы getXxx для примитивных типов данных также поддерживают расширение :
@Test public void whenDoWidening_thenSuccess() throws Exception Person person = new Person(); Field pinCodeField = person.getClass().getDeclaredField("pinCode"); pinCodeField.setAccessible(true); Long pinCode = pinCodeField.getLong(person); Assertions.assertEquals(452002L, pinCode); >
4.2. Доступ к полям с плавающим типом
Чтобы получить доступ к полям float и double , нам нужно использовать методы getFloat и getDouble соответственно:
@Test public void whenGetFloatingTypeFields_thenSuccess() throws Exception Person person = new Person(); Field heightField = person.getClass().getDeclaredField("height"); heightField.setAccessible(true); float height = heightField.getFloat(person); Assertions.assertEquals(6.1242f, height); Field weightField = person.getClass().getDeclaredField("weight"); weightField.setAccessible(true); double weight = weightField.getDouble(person); Assertions.assertEquals(75.2564, weight); >
4.3. Доступ к символьным полям
Чтобы получить доступ к полям char , мы можем использовать метод getChar :
@Test public void whenGetCharacterFields_thenSuccess() throws Exception Person person = new Person(); Field genderField = person.getClass().getDeclaredField("gender"); genderField.setAccessible(true); char gender = genderField.getChar(person); Assertions.assertEquals('M', gender); >
4.4. Доступ к логическим полям
Точно так же мы можем использовать метод getBoolean для доступа к логическому полю:
@Test public void whenGetBooleanFields_thenSuccess() throws Exception Person person = new Person(); Field activeField = person.getClass().getDeclaredField("active"); activeField.setAccessible(true); boolean active = activeField.getBoolean(person); Assertions.assertTrue(active); >
5. Доступ к частным полям, которые являются объектами
Мы можем получить доступ к закрытым полям, которые являются объектами, используя метод Field #get . Следует отметить, что общий метод get возвращает Object , поэтому нам нужно привести его к целевому типу, чтобы использовать значение :
@Test public void whenGetObjectFields_thenSuccess() throws Exception Person person = new Person(); Field nameField = person.getClass().getDeclaredField("name"); nameField.setAccessible(true); String name = (String) nameField.get(person); Assertions.assertEquals("John", name); >
6. Исключения
Теперь давайте обсудим исключения, которые JVM может генерировать при доступе к закрытым полям.
6.1. IllegalArgumentException
JVM выдаст исключение IllegalArgumentException , если мы используем метод доступа getXxx , несовместимый с типом целевого поля . В нашем примере, если мы напишем nameField.getInt(person) , JVM выдаст это исключение, поскольку поле имеет тип String , а не int или Integer :
@Test public void givenInt_whenSetStringField_thenIllegalArgumentException() throws Exception Person person = new Person(); Field nameField = person.getClass().getDeclaredField("name"); nameField.setAccessible(true); Assertions.assertThrows(IllegalArgumentException.class, () -> nameField.getInt(person)); >
Как мы уже видели, методы getXxx поддерживают расширение примитивных типов. Важно отметить, что для успешного расширения необходимо указать правильную цель . В противном случае JVM выдает исключение IllegalArgumentException :
@Test public void givenInt_whenGetLongField_thenIllegalArgumentException() throws Exception Person person = new Person(); Field contactNumberField = person.getClass().getDeclaredField("contactNumber"); contactNumberField.setAccessible(true); Assertions.assertThrows(IllegalArgumentException.class, () -> contactNumberField.getInt(person)); >
6.2. Нелегальное исключение доступа
JVM выдаст исключение IllegalAccessException , если мы попытаемся получить доступ к полю, у которого нет прав доступа . В приведенном выше примере, если мы не напишем оператор nameField.setAccessible(true) , тогда JVM выдаст исключение:
@Test public void whenFieldNotSetAccessible_thenIllegalAccessException() throws Exception Person person = new Person(); Field nameField = person.getClass().getDeclaredField("name"); Assertions.assertThrows(IllegalAccessException.class, () -> nameField.get(person)); >
6.3. носачфиелдексцептион
Если мы попытаемся получить доступ к полю, которого нет в классе Person , то JVM может сгенерировать NoSuchFieldException :
Assertions.assertThrows(NoSuchFieldException.class, () -> person.getClass().getDeclaredField("firstName"));
6.4. Исключение нулевого указателя
Наконец, как и следовало ожидать, JVM выдает исключение NullPointerException , если мы передаем имя поля как null :
Assertions.assertThrows(NullPointerException.class, () -> person.getClass().getDeclaredField(null));
7. Заключение
В этом руководстве мы увидели, как мы можем получить доступ к закрытым полям класса в другом классе. Мы также видели исключения, которые может генерировать JVM, и их причины.
Как всегда, полный код этого примера доступен на GitHub .
- 1. Обзор
- 2. Пример
- 3. Обеспечение доступа к приватным полям
- 4. Доступ к частным примитивным полям
- 4.1. Доступ к целочисленным полям
- 4.2. Доступ к полям с плавающим типом
- 4.3. Доступ к символьным полям
- 4.4. Доступ к логическим полям
- 6.1. IllegalArgumentException
- 6.2. Нелегальное исключение доступа
- 6.3. носачфиелдексцептион
- 6.4. Исключение нулевого указателя
Вложенность классов
Вложенный, или внутренний класс — в объектно-ориентированном программировании класс, целиком определённый внутри другого класса[wiki].
Если один из классов включает в себя другой, то речь идёт о вложенности классов (nested classes).
Вложенность классов имеет ряд нюансов. Но для начала следует выделить два принципа вложенности:
- нестатические вложенные классы (non static nested classes);
- статические вложенные классы (static nested classes).
Нестатические вложенные классы
При нестатической организации вложенности речь можно вести о внутренних классах.
Внутренние классы
Такой вариант вложенности предполагает описание структуры будущего объекта, имеющего дополнительные (составные) части. Причём сам объект не может существовать бы без этого наполнения. Допустим, машина должна содержать как минимум мотор и колёса.
Студента трудно представить без зачётной книжки. Рассмотрим это в виде кода на Java.
Для рассмотрения используем упрощённую версию класса Student (отдельным файлом):
public class Student < private String name; private int age; public Student(String newName, int newAge) < name = newName; age = newAge; >public void showInfo() < System.out.printf("Name: %s \nAge: %d\n", name, age); >>Зачётку студента (RecordBook) определим вложенным классом.
public class RecordBook < private int rbNumber; // номер зачётки public RecordBook(int rbNum) < rbNumber = rbNum; >public void displayRb() < System.out.printf("Record Book Number: %d\n", rbNumber); >>Но не только не в отдельном файле, а прямо в теле класса Student. Должно получиться так (RecordBook внутри Student):
public class Student < private String name; private int age; RecordBook rb; // определение объекта класса RecordBook прямо в классе Student public Student(String newName, int newAge, int newRBook) < name = newName; age = newAge; rb = new RecordBook(newRBook); // выделяем память под RecordBook в конструкторе Student >public void showInfo() < System.out.printf("Name: %s \nAge: %d\n", name, age); >public class RecordBook < // nested class private int rbNumber; // номер зачётки public RecordBook(int rbNum) < rbNumber = rbNum; >public void displayRb() < System.out.printf("Student's %s record book number is %d\n", name, rbNumber); >> // end of RecordBook > end of StudentРеализация в main будет выглядеть так:
public static void main(String[] args)
Анализ кода показывает, что в main, для получения данных о зачётной книжке пришлось обратиться к экземпляру класса RecordBook, созданного в конструкторе класса Student.

Область видимости вложенного класса RecordBook ограничена областью видимости внешнего класса Student.
tom.rb.displayRb();
не было бы возможным, если бы не была известна структура и содержание внутреннего класса. В то же время, класс RecordBook не может существовать независимо от класса Student.
Итак, нестатические вложенные классы:
- Существуют лишь у объектов, в том смысле, что для зачётной книжкой понадобился экземпляр внутреннего класса прямо в конструкторе класса-оболочки;
- Объекты внутренних классов могут быть созданы только в классе-оболочке. В других внешних классах объекты внутреннего класса создать нельзя, так как теряется внутренняя связь.
- Во вложенном классе не может быть статических переменных. Их можно создавать лишь во внешнем классе-оболочке. Такая особенность вызвана тесной связью нестатического вложенного класса с внешним.
- У нестатического вложенного класса есть полный доступ ко всем закрытым (private) полям внешнего класса.
Иными словами, без объекта внешнего класса объект внутреннего просто не может существовать. Таковы особенности внутренних (нестатических классов). Совершенно по-иному обстоит дело со статическими вложенными классами.
Статические вложенные классы
Независимость друг от друга
Принцип независимости заложен в самом определении статических объектов. Статический элемент класса привязан лишь к нему самому, а не к его экземпляру. Последнее позволяет создать экземпляр вложенного класса, без промежуточного экземпляра внешнего класса.
Принцип вложенности позволяет группировать классы, если те принадлежат друг другу логически, а также управлять доступом к ним. Другими словами, использование вложенных классов усиливает принцип инкапсуляции.
В качестве примера создадим класс Person, в котором создадим статический вложенный класс Accounting (личный номер студента, номер специальности):
class Person < private String name; // Поле - имя private String ; // обращение к полям статического вложенного класса // в инициализаторе класса - оболочки < Accounting.counter++; // увеличиваем счётчик id += Integer.toString(++Accounting.id + 100); // Формируем id >public Person(String name) < // Первый конструктор this.name = name; // Полю name присваивается значение параметра >public void showInfo() < System.out.printf("Student %s has number %d with name, Accounting.counter, id); >// Static class для подсчёта студентов и присвоения id static class Accounting < // учёт студентов public static int counter = 0; public static int >>Как видно, у студента (персоны) есть два поля: имя (name) и шифр специальности (id). Уже в инициализаторе класса-оболочки Person каждому новому студенту (экземпляру класса) присваивается номер, как обращение к полю статического вложенного класса Accounting.counter. Шифр специальности присваивается там же, с использованием статического поля Accounting.id.
Все присвоения происходят без привязки к экземпляру класса Accounting, как это было выше, с классом-оболочкой Student и внутренним классом RecordBook.Реализация в main будет иметь следующий вид:
public class Program < public static void main(String[] args) < Person bob = new Person("Bob"); bob.showInfo(); Person tim = new Person("Tim"); tim.showInfo(); >>Вся структура вложенности достаточно наглядна внутри класса и абсолютна не видна в процессе реализации.
Существуют также локальные классы, которые объявляются внутри методов класса-оболочки. А также анонимные классы – просто обычные нестатические вложенные классы, но создаваемые при реализации, т.е. при создании экземпляра другого класса. Но эти два типа вложенных классов будут рассмотрены позднее.
Заключение
Использование вложенных и внутренних классов – сокращение и улучшение качества кодирования. Исходный код становится более читабельным, безопасным (за счёт усиления уровня инкапсуляции) и удобным с точки зрения его доработок, если в них возникает необходимость.
