Перемещение метода
Метод используется в другом классе больше, чем в собственном.
Решение
Создайте новый метод в классе, который использует его больше других, и перенесите туда код из старого метода. Код оригинального метода превратите в обращение к новому методу в другом классе либо уберите его вообще.
Причины рефакторинга
- Вы хотите переместить метод в класс, который содержит данные, с которыми, в основном, работает этот метод. Этим вы увеличиваете связность внутри классов.
- Вы хотите переместить метод, чтобы убрать или уменьшить зависимость класса, вызывающего этот метод, от класса, в котором он находился. Это может быть полезно, если вызывающий класс уже имеет зависимость от класса, куда вы планируете перенести метод. Таким образом, вы уменьшаете связанность между классами.
Порядок рефакторинга
- Проверьте все фичи, используемые старым методом в его же классе. Возможно, их тоже следует переместить. Руководствуйтесь таким правилом — если фича используется только интересующим вас методом, её точно следует переносить. Если фича используется и другими методами, возможно, следует перенести и эти методы. Иногда гораздо проще перенести пачку методов, чем настраивать взаимодействие между ними в разных классах. Проверьте, не определён ли метод в суперклассах и подклассах приемника. Если это так, вам придётся либо отказаться от идеи переноса, либо реализовать в классе-получателе подобие полиморфизма, чтобы обеспечить различную функциональность метода, которая была разнесена по классам-донорам.
- Объявите новый метод в классе-приёмнике. Возможно, следует придумать для метода новое имя, которое в новом классе будет подходить ему больше.
- Определите, как вы будете обращаться к классу-получателю. Вполне возможно, у вас уже есть поле или метод, которые возвращают подходящий объект, но если нет, нужно будет написать новый метод или поле, в котором бы хранился объект класса-получателя. Теперь у вас есть способ обратиться к объекту-получателю и новый метод в его классе. С этим всем вы уже можете превратить старый метод в обращение к новому методу.
- Оцените, есть ли возможность удалить старый метод вообще? При этом нужно будет во всех местах, где используется этот метод, поставить обращение к новому.
Устали читать?
Сбегайте за подушкой, у нас тут контента на 7 часов чтения.
Или попробуйте наш интерактивный курс. Он гораздо более интересный, чем банальный текст.
Скидки!
Этот рефакторинг — малая часть интерактивного онлайн курса по рефакторингу.

- Премиум контент
- Книга о паттернах
- Курс по рефакторингу
- Введение в рефакторинг
- Чистый код
- Технический долг
- Когда рефакторить
- Как рефакторить
- Раздувальщики
- Длинный метод
- Большой класс
- Одержимость элементарными типами
- Длинный список параметров
- Группы данных
- Операторы switch
- Временное поле
- Отказ от наследства
- Альтернативные классы с разными интерфейсами
- Расходящиеся модификации
- Стрельба дробью
- Параллельные иерархии наследования
- Комментарии
- Дублирование кода
- Ленивый класс
- Класс данных
- Мёртвый код
- Теоретическая общность
- Завистливые функции
- Неуместная близость
- Цепочка вызовов
- Посредник
- Неполнота библиотечного класса
- Составление методов
- Извлечение метода
- Встраивание метода
- Извлечение переменной
- Встраивание переменной
- Замена переменной вызовом метода
- Расщепление переменной
- Удаление присваиваний параметрам
- Замена метода объектом методов
- Замена алгоритма
- Перемещение метода
- Перемещение поля
- Извлечение класса
- Встраивание класса
- Сокрытие делегирования
- Удаление посредника
- Введение внешнего метода
- Введение локального расширения
- Самоинкапсуляция поля
- Замена простого поля объектом
- Замена значения ссылкой
- Замена ссылки значением
- Замена поля-массива объектом
- Дублирование видимых данных
- Замена однонаправленной связи двунаправленной
- Замена двунаправленной связи однонаправленной
- Замена магического числа символьной константой
- Инкапсуляция поля
- Инкапсуляция коллекции
- Замена кодирования типа классом
- Замена кодирования типа подклассами
- Замена кодирования типа состоянием/стратегией
- Замена подкласса полями
- Разбиение условного оператора
- Объединение условных операторов
- Объединение дублирующихся фрагментов в условных операторах
- Удаление управляющего флага
- Замена вложенных условных операторов граничным оператором
- Замена условного оператора полиморфизмом
- Введение Null-объекта
- Введение проверки утверждения
- Переименование метода
- Добавление параметра
- Удаление параметра
- Разделение запроса и модификатора
- Параметризация метода
- Замена параметра набором специализированных методов
- Передача всего объекта
- Замена параметра вызовом метода
- Замена параметров объектом
- Удаление сеттера
- Сокрытие метода
- Замена конструктора фабричным методом
- Замена кода ошибки исключением
- Замена исключения проверкой условия
- Подъём поля
- Подъём метода
- Подъём тела конструктора
- Спуск метода
- Спуск поля
- Извлечение подкласса
- Извлечение суперкласса
- Извлечение интерфейса
- Свёртывание иерархии
- Создание шаблонного метода
- Замена наследования делегированием
- Замена делегирования наследованием
- Введение в паттерны
- Что такое Паттерн?
- История паттернов
- Зачем знать паттерны?
- Критика паттернов
- Классификация паттернов
- Фабричный метод
- Абстрактная фабрика
- Строитель
- Прототип
- Одиночка
- Адаптер
- Мост
- Компоновщик
- Декоратор
- Фасад
- Легковес
- Заместитель
- Цепочка обязанностей
- Команда
- Итератор
- Посредник
- Снимок
- Наблюдатель
- Состояние
- Стратегия
- Шаблонный метод
- Посетитель
- C#
- C++
- Go
- Java
- PHP
- Python
- Ruby
- Rust
- Swift
- TypeScript
100+ вопросов и ответов на собеседовании по Java (2023 г.)
Вот вопросы и ответы на собеседовании по Java для новичков и опытных кандидатов, желающих получить работу своей мечты.
Вопросы и ответы на собеседовании по программированию на Java для новичков
1) В чем разница между внутренним классом и подклассом?
Внутренний класс — это класс, вложенный в другой класс. Внутренний класс имеет права доступа для вложенного в него класса и может получить доступ ко всем переменным и методам, определенным во внешнем классе.
Подкласс — это класс, который наследуется от другого класса, называемого суперклассом. Подкласс может получить доступ ко всем открытым и защищенным методам и полям своего суперкласса.
2) Каковы различные спецификаторы доступа для классов Java?
В Java спецификаторы доступа — это ключевые слова, используемые перед именем класса, которое определяет область доступа. Типы спецификаторов доступа для классов:
1) Общественный: Класс, Метод, Поле доступны из любого места.
2) Защищено: Доступ к методу и полю можно получить из того же класса, которому они принадлежат, или из подклассов и из класса того же пакета, но не извне.
3) По умолчанию: Доступ к методу, полю, классу возможен только из того же пакета, а не за пределами его собственного пакета.
4) Частный: Доступ к методу и полю возможен из того же класса, к которому они принадлежат.
3) Какова цель статических методов и статических переменных?
Когда требуется совместно использовать метод или переменную между несколькими объектами класса вместо создания отдельных копий для каждого объекта, мы используем ключевое слово static, чтобы сделать метод или переменную общими для всех объектов.
4) Что такое инкапсуляция данных и каково ее значение?
Инкапсуляция — это концепция объектно-ориентированного программирования, позволяющая объединить свойства и методы в одном модуле.
Инкапсуляция помогает программистам следовать модульному подходу к разработке программного обеспечения, поскольку каждый объект имеет свой собственный набор методов и переменных и выполняет свои функции независимо от других объектов. Инкапсуляция также служит цели сокрытия данных.
5) Что такое одноэлементный класс? Приведите практический пример его использования.
Одноэлементный класс в Java может иметь только один экземпляр, и, следовательно, все его методы и переменные принадлежат только одному экземпляру. Концепция класса Singleton полезна в ситуациях, когда необходимо ограничить количество объектов в классе.
Лучшим примером одноэлементного сценария использования является ситуация, когда существует ограничение на наличие только одного подключения к базе данных из-за некоторых ограничений драйвера или каких-либо проблем с лицензированием.
6) Что такое циклы в Java? Какие три типа петель существуют?
Циклы используются в программировании для многократного выполнения оператора или блока операторов. Есть три типы циклов в Java:
1) Для циклов
Циклы for используются в Java для многократного выполнения операторов заданное количество раз. Циклы for используются, когда программисту известно, сколько раз выполнять операторы.
2) Циклы «Пока»
Цикл while используется, когда определенные операторы необходимо выполнять повторно, пока не будет выполнено условие. В циклах while условие проверяется перед выполнением операторов.
3) Делайте циклы while
Цикл Do While аналогичен циклу While с той лишь разницей, что условие проверяется после выполнения блока операторов. Следовательно, в случае цикла do while операторы выполняются хотя бы один раз.
7) Что такое бесконечный цикл? Как объявляется бесконечный цикл?
Бесконечный цикл выполняется без каких-либо условий и выполняется бесконечно. Бесконечный цикл можно прервать, определив любую логику прерывания в теле блоков операторов.
Бесконечный цикл объявляется следующим образом:
8) В чем разница между операторами продолжения и прерывания?
Break и continue — два важных ключевых слова, используемых в циклах. Когда в цикле используется ключевое слово Break, цикл прерывается мгновенно, а при использовании ключевого слова continue прерывается текущая итерация и цикл продолжается со следующей итерации.
В приведенном ниже примере цикл прерывается, когда счетчик достигает 4.
for (counter = 0; counter & lt; 10; counter++) system.out.println(counter); if (counter == 4) < break; >>
В приведенном ниже примере, когда счетчик достигает 4, цикл переходит к следующей итерации, и все операторы после ключевого слова continue пропускаются для текущей итерации.
for (counter = 0; counter < 10; counter++) system.out.println(counter); if (counter == 4) < continue; >system.out.println("This will not get printed when counter is 4"); >9) В чем разница между переменными double и float в Java?
В Java float занимает 4 байта в памяти, а Double — 8 байт. Float — это десятичное число с плавающей запятой одинарной точности, а Double — десятичное число двойной точности.
10) Что такое финальное ключевое слово в Java? Приведите пример.
В Java константа объявляется с использованием ключевого слова Final. Значение может быть присвоено только один раз, и после присвоения значение константы не может быть изменено.
В приведенном ниже примере объявлена константа с именем const_val, которой присвоено значение:
Частный финал int const_val=100
Когда метод объявлен как окончательный, он НЕ может быть переопределен подклассами. Этот метод работает быстрее, чем любой другой метод, поскольку они разрешаются в установленное время.
Когда класс объявлен как окончательный, он не может быть подклассом. Пример String, Integer и других классов-оболочек.
11) Что такое тернарный оператор? Приведите пример.
Тернарный оператор, также называемый условным оператором, используется для принятия решения о том, какое значение присвоить переменной, на основе оценки логического значения. Это обозначается как?
В приведенном ниже примере, если ранг равен 1, статусу присваивается значение «Готово», иначе — «Ожидание».
public class conditionTest < public static void main(String args[]) < String status; int rank = 3; status = (rank == 1) ? "Done" : "Pending"; System.out.println(status); >>
12) Как генерировать случайные числа в Java?
- Используя Math.random(), вы можете генерировать случайные числа в диапазоне больше или равного 0.1 и меньше 1.0.
- Использование класса Random в пакете java.util
13) Что такое переключатель по умолчанию? Приведите пример.
В заявление о переключении, случай по умолчанию выполняется, когда ни одно другое условие переключения не соответствует. Случай по умолчанию является необязательным. Его можно объявить только после того, как будут закодированы все остальные случаи переключения.
В приведенном ниже примере, если оценка не равна 1 или 2, используется регистр по умолчанию.
public class switchExample < int score = 4; public static void main(String args[]) < switch (score) < case 1: system.out.println("Score is 1"); break; case 2: system.out.println("Score is 2"); break; default: system.out.println("Default Case"); >> >14) Какой базовый класс в Java, от которого произошли все классы?
15) Может ли метод main() в Java возвращать какие-либо данные?
В Java метод main() не может возвращать какие-либо данные и, следовательно, он всегда объявляется с возвращаемым типом void.
16) Что такое пакеты Java? Какое значение имеют пакеты?
В Java пакет — это набор классов и интерфейсов, связанных друг с другом. Использование пакетов помогает разработчикам модульно структурировать код и группировать его для правильного повторного использования. После того как код упакован в пакеты, его можно импортировать в другие классы и использовать.
17) Можем ли мы объявить класс как абстрактный, не имея абстрактного метода?
Да, мы можем создать абстрактный класс, используя ключевое слово Abstract перед именем класса, даже если у него нет абстрактного метода. Однако если в классе есть хотя бы один абстрактный метод, его необходимо объявить как абстрактный, иначе он выдаст ошибку.
18) В чем разница между абстрактным классом и интерфейсом в Java?
Основное различие между абстрактным классом и интерфейсом заключается в том, что интерфейс может содержать только объявление общедоступных статических методов без конкретной реализации, тогда как абстрактный класс может иметь члены с любыми спецификаторами доступа (открытыми, частными и т. д.) с конкретной реализацией или без нее.
Еще одно ключевое отличие в использовании абстрактных классов и интерфейсов заключается в том, что класс, реализующий интерфейс, должен реализовывать все методы интерфейса, в то время как класс, наследуемый от абстрактного класса, не требует реализации всех методов своего суперкласса.
Класс может реализовывать несколько интерфейсов, но расширять только один абстрактный класс.
19) Каково влияние интерфейсов на производительность по сравнению с абстрактными классами?
Интерфейсы работают медленнее по сравнению с абстрактными классами, поскольку для интерфейсов требуются дополнительные косвенные указания. Еще одним ключевым фактором, который следует учитывать разработчикам, является то, что любой класс может расширять только один абстрактный класс, в то время как класс может реализовывать множество интерфейсов.
Использование интерфейсов также налагает дополнительную нагрузку на разработчиков, поскольку каждый раз интерфейс реализуется в классе; разработчик вынужден реализовать каждый метод интерфейса.
20) Импортирует ли пакет и его подпакеты в Java?
В Java при импорте пакета его подпакеты не импортируются, и разработчику необходимо импортировать их отдельно, если это необходимо.
Например, если разработчик импортирует пакет University.*, все классы в пакете с именем University загружаются, но классы из подпакета не загружаются. Чтобы загрузить классы из своего подпакета (скажем, отдела), разработчик должен явно импортировать их следующим образом:
21) Можем ли мы объявить основной метод нашего класса закрытым?
В Java основной метод должен быть общедоступным статическим, чтобы любое приложение работало правильно. Если основной метод объявлен как частный, разработчик не получит никаких ошибок компиляции, однако он не будет выполнен и выдаст ошибку во время выполнения.
22) Как мы можем передать аргумент функции по ссылке, а не по значению?
В Java мы можем передавать аргумент функции только по значению, а не по ссылке.
23) Как сериализуется объект в Java?
В Java для преобразования объекта в поток байтов путем сериализации класс реализует интерфейс с именем Serializable. Все объекты класса, реализующего сериализуемый интерфейс, сериализуются, и их состояние сохраняется в потоке байтов.
24) Когда нам следует использовать сериализацию?
Сериализация используется, когда данные необходимо передать по сети. Используя сериализацию, состояние объекта сохраняется и преобразуется в поток байтов. Поток байтов передается по сети, и объект воссоздается в пункте назначения.
25) Обязательно ли в Java за блоком Try должен следовать блок Catch для обработки исключений?
За блоком Try должен следовать либо блок Catch, либо блок Final, либо оба. Любое исключение, выброшенное из блока try, должно быть либо перехвачено в блоке catch, либо какие-либо конкретные задачи, которые необходимо выполнить, прежде чем прерывание кода будет помещено в блок Final.
Вопросы и ответы на собеседовании по Java для опытных
26) Есть ли способ пропустить блок исключений Final, даже если в блоке исключений возникает какое-то исключение?
Если в блоке Try возникает исключение, управление передается блоку catch, если он существует, в противном случае — окончательной блокировке. Блок Final всегда выполняется при возникновении исключения, и единственный способ избежать выполнения каких-либо операторов в блоке Final — принудительно прервать выполнение кода, написав следующую строку кода в конце блока try:
System.exit(0);
27) Когда вызывается конструктор класса?
Конструктор класса вызывается каждый раз, когда создается объект с новым ключевым словом.
Например, в следующем классе два объекта создаются с использованием ключевого слова new, и, следовательно, конструктор вызывается два раза.
public class const_example < const_example() < system.out.println("Inside constructor"); >public static void main(String args[]) < const_example c1 = new const_example(); const_example c2 = new const_example(); >>28) Может ли класс иметь несколько конструкторов?
Да, класс может иметь несколько конструкторов с разными параметрами. Какой конструктор используется для создания объектов, зависит от аргументов, передаваемых при создании объектов.
29) Можем ли мы переопределить статические методы класса?
Мы не можем переопределить статические методы. Статические методы принадлежат классу, а не отдельным объектам, и разрешаются во время компиляции (а не во время выполнения). Даже если мы попытаемся переопределить статический метод, мы не получим ни ошибки компиляции, ни влияния переопределения при запуске код.
30) Каков будет результат в приведенном ниже примере?
public class superclass < public void displayResult() < system.out.println("Printing from superclass"); >> public class subclass extends superclass < public void displayResult() < system.out.println("Displaying from subClass"); super.displayResult(); >public static void main(String args[]) < subclass obj = new subclass(); obj.displayResult(); >>Ans: Выход будет:
Отображение из подкласса
Печать из суперкласса
31) Является ли String типом данных в Java?
Строка не является примитивным типом данных в Java. Когда строка создается в Java, на самом деле создается объект класса Java.Lang.String. После создания этого строкового объекта все встроенные методы класса String можно использовать для этого строкового объекта.
32) Сколько строковых объектов создано в приведенном ниже примере?
String s1="I am Java Expert"; String s2="I am C Expert"; String s3="I am Java Expert";
В приведенном выше примере создаются два объекта класса Java.Lang.String. s1 и s3 являются ссылками на один и тот же объект.
33) Почему строки в Java называются неизменяемыми?
В Java строковые объекты называются неизменяемыми, поскольку, как только строке присвоено значение, его нельзя изменить, а в случае изменения создается новый объект.
В приведенном ниже примере ссылка str относится к строковому объекту, имеющему значение «Значение один».
String str="Value One";
Когда ему присваивается новое значение, создается новый объект String, и ссылка перемещается на новый объект.
str="New Value";
34) В чем разница между массивом и вектором?
Массив группирует данные одного и того же примитивного типа и является статическим по своей природе, тогда как векторы являются динамическими по своей природе и могут содержать данные разных типов данных.
35) Что такое многопоточность?
Многопоточность — это концепция программирования, позволяющая одновременно выполнять несколько задач в одной программе. Потоки используют один и тот же стек процессов и работают параллельно. Это помогает улучшить производительность любой программы.
36) Почему в Java используется Runnable Interface?
Интерфейс Runnable используется в Java для реализации многопоточных приложений. Интерфейс Java.Lang.Runnable реализован классом для поддержки многопоточности.
37) Каковы два способа реализации многопоточности в Java?
Многопоточные приложения можно разрабатывать на Java с использованием любой из следующих двух методологий:
1) С помощью интерфейса Java.Lang.Runnable. Классы реализуют этот интерфейс для включения многопоточности. В этом интерфейсе реализован метод Run().
2) Написав класс, расширяющий класс Java.Lang.Thread.
38) Когда в данных требуется много изменений, какой из них следует использовать? Строка или StringBuffer?
Поскольку StringBuffer являются динамическими по своей природе, и мы можем изменять значения объектов StringBuffer в отличие от String, который является неизменяемым, всегда полезно использовать StringBuffer, когда данные изменяются слишком сильно. Если в таком случае мы используем String, для каждого изменения данных будет создаваться новый объект String, что будет дополнительными накладными расходами.
39) Какова цель использования Break в каждом случае оператора Switch?
Break используется после каждого случая (кроме последнего) в переключателе, чтобы код прерывался после действительного случая и не выполнялся также в последующих случаях.
Если разрыв не используется после каждого случая, все случаи после действительного случая также выполняются, что приводит к неверным результатам.
40) Как осуществляется сбор мусора в Java?
В Java, когда на объект больше не ссылаются, вывоз мусора происходит, и объект автоматически уничтожается. Для автоматической сборки мусора Java вызывает либо метод System.gc(), либо метод Runtime.gc().
41) Как мы можем выполнить любой код еще до основного метода?
Если мы хотим выполнить какие-либо инструкции еще до создания объектов во время загрузки класса, мы можем использовать статический блок кода в классе. Любые операторы внутри этого статического блока кода будут выполняться один раз во время загрузки класса, даже до создания объектов в основном методе.
42) Может ли класс быть суперклассом и подклассом одновременно? Приведите пример.
Если используется иерархия наследования, класс может быть суперклассом для другого класса и подклассом для другого одновременно.
В приведенном ниже примере класс континента является подклассом мирового класса и суперклассом класса страны.
public class world < . >public class continenet extends world < . >public class country extends continent
43) Как создаются объекты класса, если в классе не определен конструктор?
Даже если в классе Java не определен явный конструктор, объекты создаются успешно, поскольку для создания объектов неявно используется конструктор по умолчанию. Этот конструктор не имеет параметров.
44) Как при многопоточности мы можем гарантировать, что ресурс не будет использоваться несколькими потоками одновременно?
В многопоточности доступ к ресурсам, которые совместно используются несколькими потоками, можно контролировать с помощью концепции синхронизации. С использованием синхронизированное ключевое слово, мы можем гарантировать, что только один поток может использовать общий ресурс одновременно, а другие смогут получить контроль над ресурсом только после того, как он станет свободным от другого, использующего его.
45) Можем ли мы вызвать конструктор класса для объекта более одного раза?
Конструктор вызывается автоматически, когда мы создаем объект с использованием нового ключевого слова. Он вызывается для объекта только один раз во время создания объекта, и, следовательно, мы не можем снова вызвать конструктор для объекта после его создания.
46) Есть два класса: classA и classB. Оба класса находятся в одном пакете. Может ли объект класса B получить доступ к частному члену класса A?
Частные члены класса недоступны за пределами этого класса, и любой другой класс, даже в том же пакете, не может получить к ним доступ.
47) Можем ли мы иметь в классе два метода с одинаковым именем?
Мы можем определить два метода в классе с одинаковым именем, но с разным количеством/типом параметров. Какой метод будет вызван, будет зависеть от переданных параметров.
Например, в приведенном ниже классе у нас есть два метода печати с одинаковым именем, но с разными параметрами. В зависимости от параметров соответствующий будет называться:
public class methodExample < public void print() < system.out.println("Print method without parameters."); >public void print(String name) < system.out.println("Print method with parameter"); >public static void main(String args[]) < methodExample obj1 = new methodExample(); obj1.print(); obj1.print("xx"); >>48) Как мы можем сделать копию Java-объекта?
Мы можем использовать концепцию клонирования для создания копии объекта. Используя клонирование, мы создаем копии с фактическим состоянием объекта.
Clone() — это метод интерфейса Cloneable, поэтому для создания копий объектов необходимо реализовать интерфейс Cloneable.
49) В чем преимущество использования наследования?
Ключевым преимуществом использования наследования является возможность повторного использования кода, поскольку наследование позволяет подклассам повторно использовать код своего суперкласса. Полиморфизм (расширяемость) — еще одно большое преимущество, позволяющее внедрять новые функциональные возможности, не затрагивая существующие производные классы.
50) Какой спецификатор доступа по умолчанию для переменных и методов класса?
Спецификатор доступа по умолчанию для переменных и метода защищен пакетом, т. е. переменные и класс доступны для любого другого класса, но в том же пакете, а не вне пакета.
51) Приведите пример использования указателей в классе Java.
В Java нет указателей. Поэтому мы не можем использовать концепцию указателей в Java.
52) Как мы можем ограничить наследование класса, чтобы ни один класс не мог быть от него унаследован?
Если мы хотим, чтобы класс не расширялся дальше каким-либо классом, мы можем использовать ключевое слово конец с именем класса.
В следующем примере класс Stone является Final и не может быть расширен.
public Final Class Stone < // Class methods and Variables >
53) Какова область доступа спецификатора защищенного доступа?
Когда метод или переменная объявлены со спецификатором доступа Protected, они становятся доступными в том же классе, любом другом классе того же пакета, а также в подклассе.
Модификатор Класс Упаковка Подкласс Мир что такое варган? Y Y Y Y защищенный Y Y Y N без модификатора Y Y N N частная Y N N N 54) В чем разница между стеком и очередью?
Стек и очередь используются в качестве заполнителя для набора данных. Основное различие между стеком и очередью заключается в том, что стек основан на принципе «Последним пришел — первым обслужен» (LIFO), а очередь основана на принципе FIFO (первым пришел — первым обслужен).
55) Как в Java запретить сериализацию переменных?
Если мы хотим, чтобы определенные переменные класса не сериализовались, мы можем использовать ключевое слово преходящий при их объявлении. Например, переменная trans_var ниже является временной переменной и не может быть сериализована:
public class transientExample < private transient trans_var; // rest of the code >
56) Как мы можем использовать примитивные типы данных в качестве объектов?
Примитивные типы данных, такие как int, можно обрабатывать как объекты, используя соответствующие классы-оболочки. Например, Integer — это класс-оболочка для примитивного типа данных int. Мы можем применять разные методы к классу-оболочке, как и к любому другому объекту.
57) Какие типы исключений перехватываются во время компиляции?
Проверенные исключения можно отловить во время компиляции программы. Проверенные исключения должны обрабатываться с помощью блока try catch в коде, чтобы успешно скомпилировать код.
58) Опишите различные состояния потока.
Поток в Java может находиться в одном из следующих состояний:
- Готов: когда поток создан, он находится в состоянии готовности.
- Выполняется: поток, выполняющийся в данный момент, находится в рабочем состоянии.
- Ожидание: поток, ожидающий освобождения определенных ресурсов от другого потока, находится в состоянии ожидания.
- Мертвый: поток, который прекратил работу после выполнения, находится в мертвом состоянии.
59) Можем ли мы использовать конструктор класса по умолчанию, даже если определен явный конструктор?
Java предоставляет конструктор без аргументов по умолчанию, если в классе Java не определен явный конструктор. Но если определен явный конструктор, конструктор по умолчанию не может быть вызван, и разработчик может использовать только те конструкторы, которые определены в классе.
60) Можем ли мы переопределить метод, используя то же имя метода и аргументы, но разные типы возвращаемых значений?
Основное условие переопределения метода заключается в том, что имя метода, аргументы, а также тип возвращаемого значения должны быть точно такими же, как у переопределяемого метода. Следовательно, использование другого типа возвращаемого значения не переопределяет метод.
61) Каков будет вывод следующего фрагмента кода?
public class operatorExample < public static void main(String args[]) < int x = 4; system.out.println(x++); >>
В этом случае используется оператор postfix++, который сначала возвращает значение, а затем увеличивает его. Следовательно, его результат будет 4.
61) Человек говорит, что успешно скомпилировал Java-класс, даже не имея в нем основного метода? Является ли это возможным?
Основной метод является точкой входа в класс Java и, однако, необходим для выполнения программы; класс успешно компилируется, даже если у него нет основного метода. Хотя его нельзя запустить.
62) Можем ли мы вызвать нестатический метод изнутри статического метода?
Нестатические методы принадлежат объектам класса и имеют область действия на уровне объекта, и для вызова нестатических методов из статического блока (например, из статического основного метода) сначала необходимо создать объект класса. Затем, используя ссылку на объект, эти методы можно вызвать.
63) Какие две переменные среды необходимо установить для запуска любых программ Java?
Программы Java могут выполняться на машине только после того, как правильно установлены следующие две переменные среды:
- Переменная PATH
- ПУТЬ К КЛАССУ переменная
64) Можно ли использовать переменные в Java без инициализации?
В Java, если переменная используется в коде без предварительной инициализации допустимым значением, программа не компилируется и выдает ошибку, поскольку переменным в Java не присвоено значение по умолчанию.
65) Может ли класс в Java быть унаследован более чем от одного класса?
В Java класс может быть производным только от одного класса, а не от нескольких классов. Множественное наследование не поддерживается Java.
66) Может ли конструктор иметь имя, отличное от имени класса в Java?
Конструктор в Java должен иметь то же имя, что и имя класса, и если имя отличается, он не действует как конструктор, и компилятор воспринимает его как обычный метод.
67) Каков будет результат работы Round(3.7) и Ceil(3.7)?
Round(3.7) возвращает 4, а Ceil(3.7) возвращает 4.
68) Можем ли мы использовать goto в Java для перехода к определенной строке?
В Java нет ключевого слова goto, и Java не поддерживает эту функцию перехода к определенной помеченной строке.
69) Можно ли запустить мертвую тему снова?
В Java поток, находящийся в мертвом состоянии, не может быть запущен снова. Невозможно перезапустить мертвый поток.
70) Правильно ли следующее объявление класса?
public abstract final class testClass < // Class methods and variables >
Ответ: Приведенное выше объявление класса неверно, поскольку абстрактный класс не может быть объявлен как Final.
71) Требуется ли JDK на каждом компьютере для запуска программы Java?
JDK — это комплект разработки Java, который требуется только для разработки, а для запуска программы Java на компьютере JDK не требуется. Требуется только JRE.
72) В чем разница между сравнением, выполняемым методом равенства и оператором ==?
В Java метод Equals() используется для сравнения содержимого двух строковых объектов и возвращает true, если они имеют одинаковое значение, в то время как оператор == сравнивает ссылки двух строковых объектов.
В следующем примере функцияquals() возвращает true, поскольку два строковых объекта имеют одинаковые значения. Однако оператор == возвращает false, поскольку оба строковых объекта ссылаются на разные объекты:
public class equalsTest < public static void main(String args[]) < String str1 = new String("Hello World"); String str2 = new String("Hello World"); if (str1.equals(str2)) < // this condition is true System.out.println("str1 and str2 are equal in terms of values"); >if (str1 == str2) < //This condition is true System.out.println("Both strings are referencing same object"); >else < // This condition is NOT true System.out.println("Both strings are referencing different objects"); >> >73) Можно ли определить метод в классе Java, но предоставить его реализацию в коде другого языка, например C?
Да, мы можем сделать это, используя нативные методы. В случае разработки на основе собственных методов мы определяем общедоступные статические методы в нашем классе Java без их реализации, а затем реализация выполняется на другом языке, например C, отдельно.
74) Как в Java определяются деструкторы?
В Java в классе не определены деструкторы, поскольку в этом нет необходимости. В Java есть собственный механизм сбора мусора, который выполняет работу автоматически, уничтожая объекты, на которые больше нет ссылок.
Вопросы и ответы на собеседовании по Java для людей с опытом работы более 5 лет
75) Может ли переменная быть локальной и статической одновременно?
Нет, переменная не может быть одновременно статической и локальной. Определение локальной переменной как статической приводит к ошибке компиляции.
76) Можем ли мы использовать статические методы в интерфейсе?
Статические методы не могут быть переопределены ни в одном классе, тогда как любые методы в интерфейсе по умолчанию являются абстрактными и должны быть реализованы в классах, реализующих интерфейс. Поэтому нет смысла использовать статические методы в интерфейсе Java.
77) Можем ли мы изменить значение любой переменной, определенной в интерфейсе, в классе, реализующем интерфейс?
Нет, мы не можем изменить значение любой переменной интерфейса в реализующем классе, поскольку все переменные, определенные в интерфейсе, по умолчанию являются общедоступными, статическими и конечными, а конечные переменные подобны константам, которые нельзя изменить позже.
78) Правильно ли сказать, что благодаря функции сборки мусора в Java Java-программа никогда не выходит из памяти?
Несмотря на то, что Java обеспечивает автоматическую сборку мусора, это не гарантирует, что Java-программа не выйдет за пределы памяти, поскольку существует вероятность того, что создание объектов Java выполняется более быстрыми темпами по сравнению со сборкой мусора, что приводит к заполнению памяти. все доступные ресурсы памяти.
Таким образом, сбор мусора помогает снизить вероятность выхода программы из памяти, но не гарантирует этого.
79) Можем ли мы иметь какой-либо другой тип возвращаемого значения, кроме void для основного метода?
Нет, основной метод класса Java может иметь только тип возврата void для успешного выполнения программы.
Тем не менее, если вам абсолютно необходимо вернуть значение по завершении основного метода, вы можете использовать System.exit(int status)
80) Я хочу снова получить доступ к объекту и использовать его после того, как он был собран. Как это возможно?
Как только объект был уничтожен сборщиком мусора, он больше не существует в куче, и к нему невозможно снова получить доступ. Нет возможности сослаться на него еще раз.
81) Какой метод в Java-программировании потоков является обязательным для всех потоков?
Run() — это метод интерфейса Runnable, который должен быть реализован всеми потоками.
82) Я хочу контролировать соединения с базой данных в своей программе и хочу, чтобы только один поток мог одновременно подключаться к базе данных. Как я могу реализовать эту логику?
Ответ: Это можно реализовать с помощью концепции синхронизации. Код, связанный с базой данных, можно поместить в метод, синхронизированный ключевое слово, чтобы только один поток мог получить к нему доступ одновременно.
83) Как программист может вручную вызвать исключение?
Чтобы вручную вызвать исключение в блоке кода, бросать используется ключевое слово. Затем это исключение перехватывается и обрабатывается в блоке catch.
public void topMethod() < try < excMethod(); >catch (ManualException e) <> > public void excMethod < String name = null; if (name == null) < throw (new ManualException("Exception thrown manually "); >>84) Я хочу, чтобы мой класс был разработан таким образом, чтобы ни один другой класс (даже производный класс) не мог создавать его объекты. Как я могу это сделать?
Если мы объявим конструктор класса закрытым, он не будет доступен ни одному другому классу и, следовательно, ни один другой класс не сможет создать его экземпляр, и формирование его объекта будет ограничено только им самим.
85) Как в Java хранятся объекты?
В Java каждый объект при создании получает пространство памяти из кучи. Когда объект уничтожается сборщиком мусора, пространство, выделенное для него из кучи, перераспределяется в кучу и становится доступным для любых новых объектов.
86) Как узнать реальный размер объекта в куче?
В Java нет возможности узнать точный размер объекта в куче.
87) Какому из следующих классов будет выделено больше памяти?
Класс A: три метода, четыре переменные, без объекта.
Класс B: пять методов, три переменные, ни одного объекта.
Память не выделяется перед созданием объектов. Поскольку для обоих классов не создаются объекты, память в куче не выделяется ни для одного класса.
88) Что произойдет, если исключение не будет обработано в программе?
Если исключение не обрабатывается в программе с использованием блоков try catch, программа прерывается, и после оператора, вызвавшего выдачу исключения, не выполняется ни один оператор.
89) У меня в классе определено несколько конструкторов. Можно ли вызвать конструктор из тела другого конструктора?
Если класс имеет несколько конструкторов, можно вызвать один конструктор из тела другого, используя это().
90) Что подразумевается под анонимным классом?
Анонимный класс — это класс, определенный без имени в одной строке кода с использованием ключевого слова new.
Например, в приведенном ниже коде мы определили анонимный класс в одной строке кода:
public java.util.Enumeration testMethod() < return new java.util.Enumeration() < @Override public boolean hasMoreElements() < // TODO Auto-generated method stub return false; >@Override public Object nextElement() < // TODO Auto-generated method stub return null; >>
91) Есть ли способ увеличить размер массива после его объявления?
Массивы статичны, и как только мы указали их размер, мы не можем его изменить. Если мы хотим использовать такие коллекции, где нам может потребоваться изменение размера (количества элементов), мы должны предпочесть вектор массиву.
92) Если в приложении есть несколько классов, можно ли иметь основной метод более чем в одном классе?
Если в Java-приложении есть метод main более чем в одном классе, это не вызовет никаких проблем, поскольку точкой входа для любого приложения будет определенный класс, а код начнется только с основного метода этого конкретного класса.
93) Я хочу сохранить данные объектов для дальнейшего использования. Какой лучший подход для этого?
Лучший способ сохранить данные для использования в будущем — использовать концепцию сериализации.
94) Что такое локальный класс в Java?
В Java, если мы определяем новый класс внутри определенного блока, он называется локальным классом. Такой класс имеет локальную область действия и не может использоваться за пределами блока, в котором он определен.
95) String и StringBuffer представляют объекты String. Можем ли мы сравнить String и StringBuffer в Java?
Хотя String и StringBuffer оба представляют объекты String, мы не можем сравнивать их друг с другом, и если мы попытаемся их сравнить, мы получим ошибку.
96) Какой API предоставляет Java для операций над множеством объектов?
Java предоставляет API-интерфейс Collection, который предоставляет множество полезных методов, которые можно применять к набору объектов. Некоторые из важных классов, предоставляемых Collection API, включают ArrayList, HashMap, TreeSet и TreeMap.
97) Можем ли мы привести любой другой тип к логическому типу с помощью приведения типов?
Нет, мы не можем ни привести какой-либо другой примитивный тип к логическому типу данных, ни привести логический тип данных к любому другому примитивному типу данных.
98) Можем ли мы использовать разные типы возвращаемых значений для переопределенных методов?
Основное требование переопределения метода в Java заключается в том, что переопределенный метод должен иметь то же имя и параметры. Но метод может быть переопределен с другим типом возвращаемого значения, если новый тип возвращаемого значения расширяет исходный.
Например, метод возвращает ссылочный тип.
Class B extends A < A method(int x) < //original method >B method(int x) < //overridden method >>
99) Каков базовый класс всех классов исключений?
В Java Java.lang.Throwable является суперклассом всех классов исключений, и все классы исключений являются производными от этого базового класса.
100) Каков порядок вызова конструкторов при наследовании?
В случае наследования при создании нового объекта производного класса сначала вызывается конструктор суперкласса, а затем конструктор производного класса.
Подготовьтесь к собеседованию. Проходить через Учебник по Java чтобы быть лучше подготовленным.
Этот подробный тест по Java Mock Test поможет вам развеять сомнения по поводу вопросов на собеседовании по Java, а также поможет вам успешно пройти собеседование.
Эти Java и Вопросы для собеседования по Java 8 также поможет в вашей вива (оральной части)
- Java-программа для проверки простого числа
- Алгоритм сортировки вставками в Java с примером программы
- Сортировка выбором в программе Java с примером
- Абстрактный класс и интерфейс в Java – разница между ними
- Учебное пособие по JAVA в формате PDF: основы для начинающих (загрузить сейчас)
Основы
Как и в любом языке программирования, в языке Java резервируются определенные слова, которые компилятор распознает как особые. Их нельзя использовать для именования конструкций Java: переменных, методов и т.д. Список ключевых слов не слишком велик:
abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while Формально слова true, false и null не входят в число ключевых слов, но их тоже нельзя использовать в качестве имён переменных. Обратите внимание, что Android Studio выделяет ключевые слова в редакторе кода особым цветом (синтаксическая подсветка).
Переменные
Переменные используются для хранения данных. Переменные сначала должны быть объявлены, и только после этого ими можно пользоваться.
int x; // объявлена переменная под именем x int y; // объявлена переменная под именем y
Как следует из названия, переменные могут меняться (точнее их значения). Проведём аналогию с кошачьим приютом. Котов привозят в приют, потом добрые люди забирают котов из него. Получается, что коты постоянно меняются, а приют остаётся.
Переменные могут быть двух видов
- примитивные типы: int, float, double, char и другие, которые представляют собой числа, символы
- объекты, которые представляют классы
Список переменных примитивных типов рассматривается в следующей статье.
Переменной можно присвоить начальное значение (инициализировать) через знак равенства и указанием значения. Указываемое значение должно подходить типу, который вы указали для переменной. Для объявления нескольких переменных одного типа можно использовать запятые:
int c, a, t; // объявлены три переменные типа int int p = 2, u, s = 7; // также объявлены три переменные, первая и третья при этом инициализированыТакже возможна динамическая инициализация. Вам нужно только проследить, чтобы вычисляемое выражение соответствовало переменной.
double a = 4, b = 5; double c = a + b; // переменная вычисляется динамическиВ некоторых случаях нужно, чтобы переменная не менялась, в этом случае переменная называется константой и имеет ключевое слово final.
Переменные имеют свою область видимости. Она может быть доступна только внутри метода, цикла, класса. Подобная защита уменьшает риск ошибок от несанкционированного доступа или изменений от чужого кода. Также следует помнить, что внутри блока переменные можно объявить в любом месте, но они становятся допустимыми только после объявления. Если ситуация будет обратной, то конструкция будет бессмысленной и вам не разрешат так делать:
counter = 3; // вы используете переменную до его объявления. вы лох int counter;Переменные создаются при входе в их область видимости и уничтожаются при выходе из неё. Иными словами, переменная утратит своё значение сразу после выхода из области видимости. Поэтому, переменные, которые объявлены внутри метода, не будут хранить свои значения между обращениями к этому методу.
Если объявление переменной содержит инициализацию, то инициализация будет повторяться при каждом вхождении в блок, в котором она объявлена. Допустим, у нас есть блок:
int x; for(x = 0; x < 5; x++) < int y = 42; // переменной y присваивается значение при каждом вхождении в блок y = 54; >При каждом вхождении в цикл переменной присваивается снова и снова значение 42. И хотя потом переменной присваивается значение 54, оно теряется при повторном вхождении в блок.
Блоки бывают вложенными, но тем не менее во внутреннем блоке нельзя объявлять переменные с тем же именем, что и во внешней области:
String cat = "Барсик"; < String cat = "Мурзик"; // переменная cat уже существует, так нельзя >Оператор присваивания
Оператором присваивания является одиночный знак равенства (=):
переменная = выражение;Тип переменная должен соответствовать типу выражение. Оператор присваивания можно использовать в виде цепочки присваивания:
int x, y, z; x = y = z = 9; // всем переменным присвоены значения 9Оператор присваивания берёт значение правого выражения. Поэтому выражение z = 9 будет равно 9, после чего оно присваивается переменной y, а затем — переменной x.
Помните, что в сравнении используется другой оператор ==, а не оператор присваивания.
Комментарии
В Java используются три вида комментариев. Многострочные комментарии начинаются с символов /* и заканчиваются символами */. Однострочные комментарии начинаются с комбинации символов //. Причем, однострочный комментарий можно использовать не только на отдельной строке, но и после оператора.
/* Пример многострочного комментария Вы здесь можете писать что угодно. Например, мяу-мяу. И вам за это ничего не будет */ // однострочный комментарий на отдельной строке Button resultButton; // это кнопка. Комментарий идет сразу после оператора в этой же строке
Начинающим программистам необходимо писать комментариев как можно больше, так как, вернувшись к своему коду через месяц-другой, вы с трудом вспомните, что вы тут нашкодили накодили.
Существует ещё третий тип комментариев для создания самодокументирующего кода (комментарий документации). Но это отдельная тема для разговора.
В студии создание и управление комментариями можно упростить через меню Code. Там вы найдёте такие команды как Comment With Line Comment, Comment With Block Comment. Попробуйте самостоятельно разобраться с ними.
Backdoor!
С помощью комментария злобные программисты могут внедрить закладку в разрабатываемый софт. Если в комментариях программы использовать Unicode для переноса строки и после нее написать свой код, то IDE (Android Studio) будет отображать это как комментарий, но код будет выполняться.
public void onClick(View view) < // \u000a System.out.println("Hello Kitty!"); >
На первый взгляд, код не должен выполняться. Но это не так. Можете проверить.
\u000a — это Unicode-символ переноса строки (он же \n). Сначала производится декодирование, а потом уже разбор самого кода. Получается, что сначала произойдёт перенос, а потом будет напечатан рабочий код. Следующий пример тоже рабочий.
// \u000a\u0020System\u002eout.\u0070rintln("Hello Kitty!"\u0029;Стиль оформления кода
Существует негласные правила оформления стиля при написании кода. Старайтесь их придерживаться. Также запоминайте оформление кода в документации и справочниках. Например, принято записывать имена классов с большой буквы (class JavaQuickCourseActivity). Если имя состоит из нескольких слов, то каждое слово в имени также начинается с большой буквы. Использовать символы подчеркивания или тире нежелательно (Java_Quick_Course_Activity или Java-Quick-Course-Activity).
Для методов и переменных используется такой же формат, только первый символ записывается с маленькой буквы, например, resultButton.
Константы принято писать только большими буквами — IDD_LIST_NAMES. В этом случае одного взгляда достаточно, чтобы сразу определить, что перед вами константа.
На первых порах вам этого достаточно.
Операторы
Как и везде, в Java есть операторы сложения (+), вычитания (-), умножения (*), деления (/), которые применимы к числам.
Оператор Пример использования Описание + a + b Сложение а и b (также унарный плюс) + +a Преобразование a в переменную типа int, если это переменная типа byte, short или char — a – b Вычитание b из а (также унарный минус) — -a Арифметическая инверсия а * a * b Умножение а на b / a / b Деление a на b % a % b Вычисление остатка от деления а на b (деление по модулю) ++ a++ Приращение а на 1 с предварительным вычислением значения а (инкремент) ++ ++a Приращение а на 1 с последующим вычислением значения а — a— Уменьшение а на 1 с предварительным вычислением значения а (декремент) — —a Уменьшение а на 1 с последующим вычислением значения а += a += b Краткая форма записи a = a + b (сложение с присваиванием) -= a -= b Краткая форма записи a = a – b (вычитание с присваиванием) *= a *= b Краткая форма записи a = a * b (умножение с присваиванием) /= a /= b Краткая форма записи a = a / b (деление с присваиванием) %= a %= b Краткая форма записи a = a % b (деление по модулю с присваиванием) Операнды арифметических операторов должны иметь числовой тип. Нельзя использовать их к логическим типам. Можно применять к типам char, который по сути можно представлять как тип int.
Для строк можно использовать только операции + и +=. Умножать, вычитать и делить слова нельзя. Обратите внимание, что при сложении слов «мышь»+»мышь» получается не «мыши», как предположил мой кот Рыжик, а «мышьмышь». На самом деле символ + при работе со строками называется не сложением, а конкатенацией.

Оператор деления по модулю
Существует оператор, вычисляющий остаток от деления нацело (%). Чтобы запомнить данный знак, обратите внимание на наклонную черту, как в обычном делении, которую окружают два нолика. Деление нацело обрезает, а не округляет результат.
Если 42 разделить по модулю на 10, то получим значение 2, а если 42.56 разделить по модулю на 10, то получим 2.5600000000000023:
int x = 42; double y = 42.56; mInfoTextView.append("x mod 10 = " + x % 10 + "\n"); mInfoTextView.append("y mod 10 = " + y % 10 + "\n");Деление по модулю очень удобно использовать для разбивки числа на части. Предположим вам надо получить последние две цифры 2013 года. Вот как можно это сделать:
int iYear, twoDigit; iYear = 2013; twoDigit = iYear % 100; mInfoTextView.setText(String.valueOf(twoDigit));Вот и другой пример. Предположим, у вас есть фильм «Кот в сапогах», продолжительность которого равна 135 минутам. Чтобы разбить это число на часы и минуты, нужно применить такой код:
int filmTime = 135; int hours = filmTime / 60; int minutes = filmTime % 60; mInfoTextView.setText("Кот в сапогах идёт " + hours + " часа " + minutes + " минут");В результате получим ответ: Кот в сапогах идёт 2 часа 15 минут.
Обратите внимание, что переменная minutes всегда будет содержать числа в диапазоне от 0 до 59.
Стоит запомнить одну особенность. При делении большого числа на меньшее, например (5 % 4), понятно, что остаток будет 1. При делении по модулю меньших чисел 0, 1, 2, 3 на число 4 получатся те же значения 0, 1, 2, 3.
Напоследок, остаётся сказать, что делить на 0 нельзя. У вас будет выводиться сообщение об ошибке либо на этапе компиляции, либо во время работы программы.
В задачнике есть упражнения с применением данного оператора: 1, 2
Приоритет
Если вы не прогуливали уроки математики, то знаете, что в сложных выражениях скобки позволяют определить порядок вычислений. Например, в выражении 2 + 3 * 4 сначала идет умножение, а потом сложение. Расставив скобки, мы можем сначала сложить два числа, а потом умножить:
(2 + 3) * 4 // сначала складываем, потом умножаем
Кстати, использование скобок не влияет на производительность программы. Поэтому можете не стесняться и расставлять их побольше.
Укороченная форма записи
В Java также можно использовать укороченную форму записи, чтобы одновременно произвести операцию и присвоение. Для укороченной записи используется оператор с последующим знаком равенства. Например, чтобы прибавить число 7 к переменной x и присвоить результат этой же переменной, используйте команду x += 7. Это справедливо и для других операторов:
x += 7; y -= 3; cats *= 3; numbersOfMouse /= 2;Укороченная форма записи не только сокращает объём и время написания кода, но и работает более эффективно (хотя доказательств не знаю).
Автоувеличение и автоуменьшение на единицу
Очень часто вам придется увеличивать или уменьшать значение переменной на единицу. Поэтому существует специальные операторы увеличения (инкремента) и уменьшения (декремента). Для инкремента используются два плюса (++), а для декремента два минуса (—).
Данные операторы существуют в двух версиях — префиксной и постфиксной. Префиксный инкремент или декремент значит, что ++ или — записываются перед переменной или выражением.
В этом случае сначала выполняется операция, а затем выдается результат.
При постфиксном инкременте или декременте оператор записывается после переменной или выражения:
Здесь сначала выдается значение, и лишь затем выполняется операция.
Например, мы хотим ежегодно увеличивать возраст кота в анкете:
int age = 3; // сейчас котёнку три года age++; // увеличили на годДанный код аналогичен более длинному варианту:
age = age + 1;В простых выражениях особой разницы в постфиксной и префиксной формами нет, но в сложных выражениях может играть существенную роль. Поэтому не рекомендую использовать этот способ в выражениях, чтобы не запутаться самому. Пишите код проще.
Инкремент и декремент применяется только к значениям переменных, к числу применять этот способ нельзя.
5++ // понимаю, мечтаешь о такой оценке в школе, но нельзяПо ссылке или по значению
У нас есть класс Cat
public class Cat < private String mCatName; Cat(String name) < mCatName = name; >public String getName() < return mCatName; >public void setName(String strName) < mCatName = strName; >>Попробуем, используя этот класс, передать объект Cat в метод и посмотреть, что получится:
void messWithCat(Cat kitty) < kitty = new Cat("Han"); >void changeKitty(Cat kitty) < kitty.setName("Wookie"); >Cat haveKitten()Вызовем созданные методы и увидим, как работают объекты:
Cat cat1 = new Cat("Jabba"); Cat cat2 = new Cat("Leia"); cat1.getName(); // Returns Jabba cat2.getName(); // Returns Leia messWithCat(cat1); changeKitty(cat2); Cat cat3 = haveKitten(); cat1.getName(); // Returns Jabba – Note that object remains unchanged! cat2.getName(); // Returns Wookie cat3.getName(); // Returns LukeКак передать значения параметра из класса java в переменную Cucumber

Начал разбираться Cucumber.
До недавнего времени, лезть в файлы java мне не требовалось.
Но вот возникла задача получить из конфигурационного файла адрес текущего стенда, на котором запускается тест.
Стенды каждый раз могут быть разные. По этому писать в фичафайле жёсткую ссылку на сервер не вариант. Ссылка должна генериться автоматически.
Собственно адрес я взял без проблем, а вот как его передать в сценарий, забуксовал. Прошу помощи коллективного разума.@Пусть(» ^(.+?) находится по адресу$ «)
Public String берем_адрес_текущего_стенда() throws IOException URL standUrl = new URL(Props.get(«bs.secure.soft.url»)) ;
String hostname = standUrl.getHost();
Собственно вопрос, как переменной, название которой я задаю (.+?) присвоить возвращаемое значение hostname?
Потому что когда я в фичафайле пытаюсь взять возвращённое значение и добавить его в генерируемую ссылку, получаю сообщение об ошибке.
Пример:Пусть Стенд находится по адресу
| URL | Сцепить(Стенд;»/чччч.jsps?ProductOfferNo text/javascript»> var pid = parseInt(177664); if ( pid > ipb.topic.topPid ) < ipb.topic.topPid = pid; >// Show multiquote for JS browsers if ( $(‘multiq_177664’) ) < $('multiq_177664').show(); >if( $(‘toggle_post_177664’) ) < $('toggle_post_177664').show(); >// Add perm data ipb.topic.deletePerms[177664] = < 'canDelete' : 0, 'canSoftDelete' : 0 >;
#2
BabyRoot
Отправлено 03 октября 2020 — 12:27
Сделать переменную hostname глобальной.
String hostname = «»; @Пусть(«^(.+?) находится по адресу$») Public String берем_адрес_текущего_стенда() throws IOException
И вы теперь в коде можете в других методах использовать эту переменную.
Вы немного не правильно поняли: ^(.+?) — это дело можно передать в параметр метода берем_адрес_текущего_стенда
Вот так:@Пусть(«^(.+?) находится по адресу$») Public String берем_адрес_текущего_стенда(String символы_что_мы_нашли_из_верхнего_правила) throws IOException
#3
FinalVerdict FinalVerdict
Отправлено 04 октября 2020 — 14:24
И вы теперь в коде можете в других методах использовать эту переменную.
Вы немного не правильно поняли: ^(.+?) — это дело можно передать в параметр метода берем_адрес_текущего_стенда
Вот так:@Пусть(«^(.+?) находится по адресу$») Public String берем_адрес_текущего_стенда(String символы_что_мы_нашли_из_верхнего_правила) throws IOException
Тогда я не понял, как полученное значение hostname присвоить переменной Стенд , которой я буду далее оперировать уже в фичафайле?
Толку с того что я получил адрес текущего сервера, если я не могу с ним ничего сделать?Подскажи пожалуйста, как это должно выглядеть.
#4
BabyRoot
Отправлено 04 октября 2020 — 18:36
Вы не правильно думаете. Вы не можете из кода что-то добавлять в фича-файл.
Вы из него только читаете то что там есть.
Я понял, у вас в фиче-файле есть слово стенд, объедините 2 шага «Пусть Стенд находится по адресу» и «Переходим по url: URL»
В один — «Открыть стенд» (а в методе для этого шага берите адрес из конфигурационного файла).
Если же у вас урл может разный быть, то напишите простой метод — отрыть страницу по такому-то адресу.
Вот эта муть зачем? «Сцепить(Стенд;»/чччч.jsps?ProductOfferNo=»;productOfferNo)»
Предавайте уже готовый урл, либо пишите общий метод для открытия продукта — открыть_страницу_продукта(String productOfferNo), в котором вы возьмёте productOfferNo и адрес стенда из конфиг-файла, и сформируете полный урл в методе.
Зачем так фиче-файл усложнять?
Ещё подумав, понял
Пусть Стенд находится по адресу — сделайте метод который берёт адрес стенда из конфиг-файла, и сетит глобальную переменную, как я показал.
| URL | Сцепить(Стенд;»/чччч.jsps?ProductOfferNo text/javascript»> var pid = parseInt(177669); if ( pid > ipb.topic.topPid ) < ipb.topic.topPid = pid; >// Show multiquote for JS browsers if ( $(‘multiq_177669’) ) < $('multiq_177669').show(); >if( $(‘toggle_post_177669’) ) < $('toggle_post_177669').show(); >// Add perm data ipb.topic.deletePerms[177669] = < 'canDelete' : 0, 'canSoftDelete' : 0 >;
#5
FinalVerdict FinalVerdict
Отправлено 04 октября 2020 — 20:22
Вы не правильно думаете. Вы не можете из кода что-то добавлять в фича-файл.
Вы из него только читаете то что там есть.
Я понял, у вас в фиче-файле есть слово стенд, объедините 2 шага «Пусть Стенд находится по адресу» и «Переходим по url: URL»
В один — «Открыть стенд» (а в методе для этого шага берите адрес из конфигурационного файла).
Если же у вас урл может разный быть, то напишите простой метод — отрыть страницу по такому-то адресу.
Вот эта муть зачем? «Сцепить(Стенд;»/чччч.jsps?ProductOfferNo=»;productOfferNo)»
Предавайте уже готовый урл, либо пишите общий метод для открытия продукта — открыть_страницу_продукта(String productOfferNo), в котором вы возьмёте productOfferNo и адрес стенда из конфиг-файла, и сформируете полный урл в методе.
Зачем так фиче-файл усложнять?
Ещё подумав, понял
Пусть Стенд находится по адресу — сделайте метод который берёт адрес стенда из конфиг-файла, и сетит глобальную переменную, как я показал.
| URL | Сцепить(Стенд;»/чччч.jsps?ProductOfferNo text/javascript»> var pid = parseInt(177670); if ( pid > ipb.topic.topPid ) < ipb.topic.topPid = pid; >// Show multiquote for JS browsers if ( $(‘multiq_177670’) ) < $('multiq_177670').show(); >if( $(‘toggle_post_177670’) ) < $('toggle_post_177670').show(); >// Add perm data ipb.topic.deletePerms[177670] = < 'canDelete' : 0, 'canSoftDelete' : 0 >;
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных
Ответить цитируемым сообщениям Очистить
- Форум тестировщиков
- → Тестирование
- → Автоматизированное тестирование
- → Selenium — Functional Testing
- Политика Конфиденциальности
- Правила форума ·


- Помощь
