Экземпляром какого класса является поле system err
Перейти к содержимому

Экземпляром какого класса является поле system err

  • автор:

Краткое руководство по java.lang.System

В этом руководстве мы кратко рассмотрим класс java.lang.System , его функции и основные функции.

2. ИО

System является частью java.lang , и одной из его основных функций является предоставление нам доступа к стандартным потокам ввода-вывода.

Проще говоря, он предоставляет три поля, по одному для каждого потока:

2.1. Системный выход

System.out указывает на стандартный поток вывода, представляя его как PrintStream , и мы можем использовать его для вывода текста на консоль:

 System.out.print("some inline message"); 

Расширенное использование System заключается в вызове System.setOut , который мы можем использовать для настройки местоположения, в которое System.out будет записывать:

 // Redirect to a text file   System.setOut(new PrintStream("filename.txt")); 

2.2. Система.ошибка

System.err очень похож на System.out . Оба поля являются экземплярами PrintStream, и оба предназначены для вывода сообщений на консоль.

Но System.err представляет собой стандартную ошибку, и мы используем ее специально для вывода сообщений об ошибках:

 System.err.print("some inline error message"); 

Консоли часто отображают поток ошибок иначе, чем выходной поток.

Дополнительные сведения см. в документации по PrintStream .

2.3. System.in

System.in указывает на стандартный in, представляя его как InputStream, и мы можем использовать его для чтения ввода с консоли.

И хотя мы немного больше вовлечены, мы все еще можем управлять:

 public String readUsername(int length) throws IOException    byte[] name = new byte[length];   System.in.read(name, 0, length); // by default, from the console   return new String(name);   > 

Вызывая System.in.read , приложение останавливается и ожидает ввода из стандартного ввода. Какие бы ни были байты следующей длины , они будут считаны из потока и сохранены в массиве байтов.

Все остальное, что вводит пользователь, остается в потоке , ожидая другого вызова для чтения.

Конечно, работа на таком низком уровне может быть сложной и чреватой ошибками, поэтому мы можем немного почистить ее с помощью BufferedReader :

 public String readUsername() throws IOException    BufferedReader reader = new BufferedReader(   new InputStreamReader(System.in));   return reader.readLine();   > 

В приведенном выше расположении readLine будет читать из System.in до тех пор, пока пользователь не нажмет return, что немного ближе к тому, что мы могли бы ожидать.

Обратите внимание, что в данном случае мы намеренно не закрываем поток. Закрытие стандарта означает , что его нельзя прочитать снова в течение жизненного цикла программы!

И, наконец, расширенное использование System.in заключается в вызове System.setIn для перенаправления его в другой InputStream .

3. Вспомогательные методы

Система предоставляет нам множество методов, чтобы помочь нам с такими вещами, как:

  • Доступ к консоли
  • Копирование массивов
  • Дата и время наблюдения
  • Выход из JRE
  • Доступ к свойствам среды выполнения
  • Доступ к переменным среды и
  • Управление сбором мусора

3.1. Доступ к консоли

В Java 1.6 появился другой способ взаимодействия с консолью, а не просто использование System.out и in напрямую.

Мы можем получить к нему доступ, вызвав System.console :

 public String readUsername()    Console console = System.console();    return console == null ? null :   console.readLine("%s", "Enter your name: ");   > 

Обратите внимание, что в зависимости от базовой операционной системы и того, как мы запускаем Java для запуска текущей программы, консоль может возвращать значение null, поэтому всегда обязательно проверяйте перед использованием .

Прочтите документацию по консоли , чтобы узнать больше об использовании.

3.2. Копирование массивов

System.arraycopy — это старый способ копирования одного массива в другой в стиле C.

В основном, arraycopy предназначен для копирования одного полного массива в другой массив:

 int[] a = 34, 22, 44, 2, 55, 3>;   int[] b = new int[a.length];    System.arraycopy(a, 0, b, 0, a.length);   assertArrayEquals(a, b); 

Однако мы можем указать начальную позицию для обоих массивов, а также количество копируемых элементов.

Например, допустим, мы хотим скопировать 2 элемента из a , начиная с a[1] в b , начиная с b[3] :

 System.arraycopy(a, 1, b, 3, 2);   assertArrayEquals(new int[] 0, 0, 0, 22, 44, 0>, b); 

Также помните, что arraycopy выдаст:

  • NullPointerException , если любой из массивов имеет значение null
  • IndexOutOfBoundsException , если копия ссылается на какой-либо массив за пределами своего диапазона
  • ArrayStoreException , если копия приводит к несоответствию типа

3.3. Дата и время наблюдения

В System есть два метода, связанных со временем . Один — currentTimeMillis , а другой — nanoTime .

currentTimeMillis возвращает количество миллисекунд, прошедших с эпохи Unix, то есть 1 января 1970 года, 12:00 UTC:

 public long nowPlusOneHour()    return System.currentTimeMillis() + 3600 * 1000L;   >    public String nowPrettyPrinted()    return new Date(System.currentTimeMillis()).toString();   > 

nanoTime возвращает время относительно запуска JVM. Мы можем вызвать его несколько раз, чтобы отметить течение времени в приложении:

 long startTime = System.nanoTime();   // .   long endTime = System.nanoTime();    assertTrue(endTime - startTime  10000); 

Обратите внимание, что, поскольку nanoTime настолько детализирован, безопаснее использовать endTime — startTime < 10000 , чем endTime < startTime из-за возможности числового переполнения .

3.4. Выход из программы

Если мы хотим программно выйти из выполняемой в данный момент программы, System.exit сделает свое дело.

Чтобы вызвать выход , нам нужно указать код выхода, который будет отправлен на консоль или оболочку, запустившую программу.

По соглашению в Unix статус 0 означает нормальный выход, а ненулевой означает, что произошла какая-то ошибка:

 if (error)    System.exit(1);   > else    System.exit(0);   > 

Обратите внимание, что в настоящее время для большинства программ было бы странно вызывать это. Например, при вызове в приложении веб-сервера он может отключить весь сайт!

3.5. Доступ к свойствам среды выполнения

Система предоставляет доступ к свойствам времени выполнения с помощью getProperty .

И мы можем управлять ими с помощью setProperty и clearProperty :

 public String getJavaVMVendor()    System.getProperty("java.vm.vendor");   >    System.setProperty("abckey", "abcvaluefoo");   assertEquals("abcvaluefoo", System.getProperty("abckey"));    System.clearProperty("abckey");   assertNull(System.getProperty("abckey")); 

Свойства, указанные через -D , доступны через getProperty .

Мы также можем указать значение по умолчанию:

 System.clearProperty("dbHost");   String myKey = System.getProperty("dbHost", "db.host.com");   assertEquals("db.host.com", myKey); 

А System.getProperties предоставляет набор всех системных свойств:

 Properties properties = System.getProperties(); 

Из которого мы можем делать любые операции со свойствами :

 public void clearAllProperties()    System.getProperties().clear();   > 

3.6. Доступ к переменным среды

Система также предоставляет доступ только для чтения к переменным среды с помощью getenv .

Например, если мы хотим получить доступ к переменной среды PATH , мы можем сделать:

 public String getPath()    return System.getenv("PATH");   > 

3.7. Управление сборкой мусора

Как правило, усилия по сборке мусора непрозрачны для наших программ. Однако иногда мы можем захотеть сделать прямое предложение JVM.

System.runFinalization — это метод, который позволяет нам предложить JVM выполнить процедуру финализации.

System.gc — это метод, который позволяет нам предложить JVM запустить процедуру сборки мусора.

Поскольку контракты этих двух методов не гарантируют, что завершение или сборка мусора будут выполняться, их полезность ограничена.

Однако их можно использовать как оптимизацию, например, вызывать gc , когда настольное приложение свернуто:

 public void windowStateChanged(WindowEvent event)    if ( event == WindowEvent.WINDOW_DEACTIVATED )    System.gc(); // if it ends up running, great!   >   > 

Чтобы узнать больше о финализации, ознакомьтесь с нашим руководством по финализации .

4. Вывод

В этой статье мы познакомились с некоторыми полями и методами , предоставляемыми системой . Полный список можно найти в официальной документации Системы .

Кроме того, ознакомьтесь со всеми примерами в этой статье на Github .

Java | Вопросы с ответами

2. Дан код:
public class Quest4 public static void main(String[] args) byte b[] = new byte[80];
for (int i=0; i System.out.print(“Ok”);
>
>
Результатом компиляции запуска будет?
>> ошибка компиляции, так как метод read() может порождать исключительную ситуацию типа IOException.

3. Программы Java категория Приложение (application)?
>> аналог “обычной” прикладной программы.

4. Программы Java категория Апплет (applet)?
>> специализированная программа с ограниченными возможностями, работающая в окне WWW-документа под управлением браузера.

5. Программы Java категория Сервлет (servlet)?
>> специализированная программа с ограниченными возможностями, работающая в WWW на стороне сервера. Используется преимущественно в рамках технологии JSP для программирования WWW-документов со стороны сервера.

6. Программы Java категория Серверное приложение (Enterprise application)?
>> предназначено для многократного использования на стороне сервера.

7. Программы Java категория Библиотека (Java Class Library)?
>> библиотека классов, либо NetBeansModule – модуль платформы NetBeans) – предназначена для многократного использования программами Java.

8. Какие из следующих строк скомпилируются без ошибки?
>> int i = 32565;
— float f = 7.0;
— char c = «z»;
— byte b = 255;
— boolean n = null;

9. Какие из следующих строк скомпилируются без ошибки?
>> int j = ’ъ’;
— float f = 7.0;
— char c = «z»;
— byte b = 255;
— boolean n = null;

10. Какие варианты записи оператора условного перехода корректны?
>> if (i
— if (i — if i
— if [i — if then System.out.print(«-6-«);

12. Какие из следующих идентификаторов являются корректными?
>> _int;
— 2int;
— int_#;
— #int
— _#int

13. Назначение утилиты javac?
>> Компилятор в режиме командной строки для программ, написанных на языке Java.

14. Назначение утилиты java?
>> Утилита для запуска в режиме командной строки откомпилированных программ-приложений.

15. Назначение утилиты appletviewer?
>> Утилита для запуска на исполнение и отладку апплетов без браузера. При этом не гарантируется работоспособность отлаженного апплета в браузере.

16. Назначение утилиты jdb?
>> Отладчик программ, написанных на языке Java.

17. Назначение утилиты javadoc?
>> Генератор документации по классом на основе комментариев, начинающихся с /**.

18. Назначение утилиты jar?
>> Создание и управление Java-архивами jar.

19. Назначение утилиты javah?
>> Генератор заголовочных файлов C/C++ для подключения к программам Java внешних библиотек C/C++ на основе интерфейса JNI.

20. Назначение утилиты javap?
>> Дизассемблер классов.

21. Назначение утилиты extcheck?
>> Утилита для обнаружения конфликтов между файлами архивов jar.

22. Назначение утилиты native2ascii?
>> Утилита для конвертации в режиме командной строки параметра, передаваемого в виде текста на национальном алфавите, в последовательность символов UNICODE.

23. Управляющая последовательность: \a ?
>> звонок.

24. Управляющая последовательность: \b ?
>> возврат на один символ назад.

25. Управляющая последовательность: \f ?
>> перевод на новую страницу.

26. Управляющая последовательность: \n ?
>> перевод на новую строку.

27. Управляющая последовательность: \r ?
>> возврат к началу строки.

28. Управляющая последовательность: \t ?
>> горизонтальная табуляция.

29. Управляющая последовательность: \v ?
>> вертикальная табуляция.

30. Управляющая последовательность: \’ ?
>> кавычка.

31. Управляющая последовательность: \” ?
>> двойные кавычки.

32. Управляющая последовательность: \\ ?
>> обратная косая черта.

33. Управляющая последовательность: \u ?
>> начало кодировки символа Unicode.

34. Оператор ~ ?
>> Оператор побитового дополнения (побитовое “не”).

35. Оператор ^ ?
>> Оператор “исключающее или” (XOR).

36. Оператор & ?
>> Оператор “побитовое и” (AND).

37. Оператор | ?
>> Оператор “побитовое или” (OR).

38. Оператор ! ?
>> Оператор “НЕ”.

39. Оператор && ?
>> Оператор “логическое И” (AND).

40. Оператор || ?
>> Оператор “ логическое ИЛИ” (OR).

41. Оператор >> Оператор левого побитового сдвига.

42. Оператор >>> ?
>> Оператор беззнакового правого побитового сдвига.

43. Оператор >> ?
>> Оператор правого побитового сдвига с сохранением знака отрицательного числа.

44. Для чего предназначен пакет java.applet?
>> Классы, необходимые для создания аплетов.

45. Для чего предназначен пакет java.awt?
>> Графический пользовательский интерфейс на базе AbstractWindowsToolkit.

46. Для чего предназначен пакет java.awt.color?
>> Пространства цветов для AWT.

47. Для чего предназначен пакет java.awt.datatransfer?
>> Передача данных внутри программы и между программами.

48. Для чего предназначен пакет java.awt.dnd?
>> Поддержка технологии drag-and-drop.

49. Для чего предназначен пакет java.awt.event?
>> Обработка событий AWT.

50. Для чего предназначен пакет java.awt.im?
>> Поддержка нестандартных методов ввода текста.

51. Для чего предназначен пакет java.awt.im.spi?
>> Интерфейсы для создания нестандартных методов ввода текста.

52. Для чего предназначен пакет java.lang?
>> Базовые классы языка Java.

53. Для чего предназначен пакет java.lang.ref?
>> Управление ссылками на объекты.

54. В папке build проекта NetBeans находятся?
>> хранятся скомпилированные файлы классов, имеющие расширение .class.

55. В папке dist проекта NetBeans находятся?
>> файлы, предназначенные для распространения как результат компиляции (модуль JAR приложения или библиотеки, а также документация к нему).

56. В папке nbproject проекта NetBeans находятся?
>> находится служебная информация по проекту.

57. В папке src проекта NetBeans находятся?
>> исходные коды классов. Кроме того, там же хранится информация об экранных формах (которые будут видны на экране в виде окон с кнопками, текстом и т.п.). Она содержится в XML-файлах, имеющих расширение .form.

58. В папке test проекта NetBeans находятся?
>> сопроводительные тесты, предназначенные для проверки правильности работы классов проекта.

59. Команды документации (символы метаданных) @see?
>> применяется для создания в документе гиперссылок на другие комментарии. Можно использовать для любых конструкций (классов, методов и т.д. ).

60. Команды документации (символы метаданных) @since?
>> Информация о версии JDK, начиная с которой введён или работоспособен класс или интерфейс.

61. Команды документации (символы метаданных) @throws?
>> Информация об исключительных ситуациях, которые могут возбуждаться методом.

62. Команды документации (символы метаданных) @param?
>> информация о параметре метода.

63. Команды документации (символы метаданных) @deprecated?
>> информация о том, что данный метод устарел и в последующих версиях будет ликвидирован. При попытке использования таких методов компилятор выдаёт программисту предупреждение (warning) о том, что метод устарел, хотя и компилирует проект.

64. Целые типы, тип byte?
>> Однобайтовое целое число (8-битное целое со знаком).

65. Целые типы, тип short?
>> Короткое целое число (16- битное целое со знаком).

66. Целые типы, тип char?
>> Символьный тип (беззнаковое 16- битное целое).

67. Целые типы, тип int?
>> Целое число (32- битное целое со знаком).

68. Целые типы, тип long?
>> Длинное целое число (64- битное целое со знаком).

69. Выберите правильный вариант a,b,c,d чтобы результат выражения a&&b || c^ d являлся истиной?
>> все ответы верны
— a=true, b=true, c=false, d=true
— a=false, b=false, c=false, d=true
— a=false, b=false, c=true, d=false
— a=true, b=true, c=true, d=true

70. Выберите правильный вариант a,b,c,d чтобы результат выражения a&&(b || c)^ d являлся ложью?
>> все ответы верны
— a=false, b=true, c=false, d=true
— a=true, b=true, c=false, d=true
— a=false, b=false, c=false, d=true
— a=false, b=false, c=false, d=false

71. Вещественные типы, размер типа float?
>> 4 байта

72. Вещественные типы, размер типа double?
>> 8 байт

73. Float f1 = new Float(Float.NaN);
Float f2 = new Float(Float.NaN);
System.out.println( «»+ (f1 == f2)+» «+f1.equals(f2)+ » «+(Float.NaN == Float.NaN) );
Что будет выведено в результате выполнения данного куска кода?
>> false true false

74. int i = 0;
i++;
System.out.print(i);
i = i++;
System.out.println(i); Что выведет данный код?
>> 11

75. int i = 0, j = 5;
tp: for (;;) < i++;
for (;;) < if (i >—j) breaktp; > >
System.out.println(«i =» + i + «, j = » + j);> Что произойдет во время компиляции и выполнения данного фрагмента кода?
>> Ошибка компиляции.

76. int i = 1; //1
i = -+(10 + 2 + i); //2
++i—; //3
System.out.println(i); В какой строке(-ах) кода содержится ошибка?
>> 3.

77. Integer i = newInteger(«10»);
if (i.toString().intern() == i.toString().intern()) System.out.println(«Равный»);
> else System.out.println(«Не равный»); >> Результат выполнения программы?
>> Выведется “Равный”.

78. public class Main public static void main(String[] args) Boolean b1 = new Boolean(«true»); System.out.print(b1 +» «);
b1 =new Boolean(«tRuE»); System.out.print(b1 +» «);
b1 =new Boolean(«test»); System.out.print(b1 +» «);
b1 =new Boolean(true); System.out.print(b1 +» «);
b1 = true; System.out.println(b1); >> каким будет результат компиляции и выполнения кода?
>> true true false true true

79. public class Test static < System.out.print("Bo-Bo ");>
public static void main(String[] args) System.out.print(«Hello, World! «); >
static < System.out.println("Go-Go "); System.exit(0); >> что выведет код?
>> Bo-Bo Go-Go

80. int i = 1; //1
i = -+(10 + 2 + 1); //2
++i—; //3
System.out.println(i); В какой строке(-ах) кода содержится ошибка?
>> 3

81. Integer a = 128; Integer b = 128;
Integer c = -128; Integer d = -128;
System.out.print((a == b)+» «);
System.out.println(c == d); Что будет выведено на экран?
>> false true

82. Boolean b = new Boolean(«Hello»);
System.out.println(b); Какой результат выполнения данного кода?
>> false

83. public class Test static < i =5; >
static int i = 6;
public static void main(String[] args) System.out.println(i); >> Выберите правильный ответ?
>> 6

84. public class MathTest public static void main(String[] args) System.out.print(((-7 % 5)>(7 % -5))+» «);
System.out.println(Math.abs(Math.ceil(-2.5))>
Что будет напечатано в результате выполнения данного кода?
>> false true

85. int i = 0;
System.out.print(i++);
System.out.println(i); Результат кода?
>> 01

86. int j = 0;
System.out.print(++j);
System.out.println(j); Результат кода?
>> 11

87. public class TestClass
int i = getInt();
int k = 20;
public int getInt()
public static void main(String[] args)
TestClass t = new TestClass ();
System.out.println(t.i+» «+t.k); >>
Что выведет этот код?
>> Будет выведено на печать 1 20

88. int x = 0;
int y = 10;
do< y--;
++x;> while(x<5);
System.out.print(x+»,»+y); >
Что напечатает этот код?
>> напечатает 5 5

89. Дана строка:
String s=»true,false»;
Каким способом можно сформировать новую строку, равную “test”?
>> String n = s.substring(0,1) + s.substring(9,10) + s.substring(8,9) + s.substring(0,1)

90. int result = 12+2*5%3-15/4;
String x=12-6+»Hello»+7+5;
System.out.println(result+»-«+x);
Что будет выведено на консоль?
>> 10-6Hello75

91. String s1=»Строка типа String»;
String s2=»Строка«;
s2+=» типа String»;
if(s1==s2) System.out.println(«s1 равно s2″);
else System.out.println(«s1 не равно s2″);
Что выведет этот код?
>> s1 не равно s2

92. String s1=»Строка типа String»;
String s2=»Строка«;
s2+=» типа String»;
if(s1.equals(s2)) System.out.println(«s1 равно s2″);
else System.out.println(«s1 не равно s2″);
Что выведет этот код?
>> s1 равно s2

93. String s1=»Строка»;
String s2=»Строка»;
if(s1==s2) System.out.println(«s1 равно s2″);
else System.out.println(«s1 не равно s2″);
Что выведет этот код?
>> s1 равно s2

94. String s=»»;
s+= 1+2+3;
System.out.println(s);
Что выведет этот код?
>> 6

95. String s=»Сумма =»+1+2+3;
System.out.println(s);
Что выведет этот код?
>> Сумма=123

96. String s=1+2+» не равно «+1+2;
System.out.println(s);
Что выведет этот код?
>> 3 не равно 12

97. Работа с графикой. Функция clearRect(x,y,w,h)?
>> Очистка прямоугольника (заполнение текущим цветом).

98. Работа с графикой.Функция fill3DRect(x,y,w,h, isRaised)?
>> Вывод «объемного» прямоугольника, заполненного текущим цветом.

99. Работа с графикой.Функция fillPolygon(Polygon p)?
>> Вывод многоугольника, заполненного текущим цветом.

100. Работа с графикой. Функция copyArea(x,y,w,h,dx,dy)?
>> Копирование области на новое место.

101. Переменные класса File. String pathSeparator?
>> Содержит строку с символом разделителя пути в операционной системе. Это «/» в Unix-подобных системах и «\» в Windows.

102. Переменные класса File.char pathSeparatorChar?
>> Содержит символ разделителя пути в операционной системе. Это «/» в Unix-подобных системах и «\» в Windows.

103. Переменные класса File.String separator?
>> Содержит строку с символом разделителя между именами файлов и файловых масок в операционной системе.

104. Переменные класса File. char separatorChar?
>> Содержит символ разделителя между именами файлов и файловых масок в операционной системе.

105. Методы класса File.canRead() ?
>> Возвращает true в случае, когда файл (или папка) с заданным в конструкторе именем существует и доступен по чтению. Иначе false.

106. Методы класса File.setReadOnly() ?
>> Возвращает true в случае, когда файл (или папка) с заданным в конструкторе именем существует, и ему удалось установить статус «доступен только по чтению». Иначе false.

107. Методы класса File. isDirectory() ?
>> Возвращает true в случае, когда файл или папка с заданным в конструкторе именем существует и является папкой. Иначе false.

108. Методы класса File. isFile() ?
>> Возвращает true в случае, когда файл или папка с заданным в конструкторе именем существует и является файлом. Иначе false.

109. Методы класса File.isHidden() ?
>> Возвращает true в случае, когда файл или папка с заданным в конструкторе именем существует и является скрытым. Иначе false.

110. Методы класса File. lastModified() ?
>> Возвращает время последней модификации файла, если он существует и доступен по чтению. Иначе 0L.

111. Методы класса File. setLastModified(long time) ?
>> Устанавливает время последней модификации файла. Возвращает true, если он существует и доступен по записи. Иначе false.

112. Методы класса File.getName() ?
>> Возвращает короткое имя файла или папки.

113. Методы класса File.getAbsolutePath() ?
>> Возвращает абсолютный путь к файлу или папке, включая имя файла. При этом, если в имени файла в конструкторе была задана относительная адресация, соответствующая часть пути сохраняется в возвращаемой строке.

114. Методы класса File. getCanonicalPath() ?
>> Возвращает абсолютный путь к файлу или папке, включая имя файла. При этом, если в имени файла в конструкторе была задана относительная адресация, соответствующая часть пути заменяется в возвращаемой строке на канонический вариант адресации – без элементов относительной адресации.

115. Методы класса File.compareTo(File f) ?
>> Сравнение имён файлов (папок), сопоставляемых текущему файловому объекту и объекту f. Возвращает 0 в случае, когда абсолютные имена файлов (папок) совпадают. Иначе возвращает число, зависящее от разницы в длинах имён и кодов, составляющих их символов.

116. Методы класса File.isAbsolute() ?
>> Возвращает true в случае, когда адресация к имени файла (папки) текущего файлового объекта является абсолютной. Хотя может содержать элементы относительной адресации, то есть не быть канонической.

117. Методы класса File.equals(Object obj) ?
>> Возвращает true тогда и только тогда, когда текущий объект и параметр obj соответствует одному и тому же файлу (папке).

118. Методы класса File.createTempFile(String prefix, String suffix) ?
>> Обеспечивает создание пустого файла (или папки), задаваемого коротким именем prefix+suffix в папке операционной системы, предназначенной для временных файлов. Возвращает ссылку на объект. Префикс должен быть не менее 3 символов.

119. Методы класса File.mkdir() ?
>> Попытка создания папки по имени, которое было задано в конструкторе объекта. Возвращает true в случае успешного создания и false в других случаях.

120. Методы класса File.renameTo(File dest) ?
>> Попытка переименования файла или папки с имени, которое было задано в конструкторе объекта, на новое, задаваемое параметром dest. Возвращает true в случае успешного переименования и false в других случаях.

121. Методы класса File.getAbsoluteFile() ?
>> Создание нового файлового объекта по абсолютному пути, соответствующему текущему файловому объекту.

122. Методы класса File.list() ?
>> Возвращает массив строк (список) коротких имён, находящихся в папке файлов и папок. Имена элементов, находящихся во вложенных папках, не показываются. Если файловый объект не соответствует существующей папке, возвращает null.

123. Конструкторы?
>> это методы, используемые для инициализации объектов в процессе их реализации.

124. Как объекты обмениваются информацией?
>> Объекты общаются друг с другом посредством посылки сообщений.

125. Что такое this?
>> ссылка, с помощью которой объект обращается к самому себе.

126. Класс ?
>> Класс – это структурный тип данных, который включает описание полей данных, а также процедур и функций, работающих с этими полями данных.

127. Процедуры и функции, работающие с полями данных класса?
>> Называются методами.

128. Объединение полей данных и процедур и функций, работающих с этими данными, в единый пакет, при наличии специальных правил доступа к элементам пакета?
>> Инкапсуляция.

129. Основные средства разработки классов. Наследование?
>> Конструирование новых более сложных классов из уже имеющихся посредством добавления полей и определения новых методов (принцип иерархичности).

130. Основные средства разработки классов. Полиморфизм?
>> обеспечивает возможность задания различных реализаций некоторого единого по названию метода для классов различных уровней иерархии.

131. Полиморфными объектами или полиморфными переменными называются?
>> переменные, которым в процессе выполнения программы может быть присвоено значение, тип которого отличается от типа переменной.

132. К изменению свойств объекта возможен только через принадлежащие ему?
>> методы.

133. В момент времени объект характеризуется:?
>> Свойствами

134. Программа в объектно-ориентированном программировании состоит из:?
>> событийных процедур.

135. Инкапсулированные в классе процедуры и функции называются?
>> Методы

136. Процесс, при котором различный код и данные различных модулей соединяются друг с другом в процессе исполнения, называют компоновкой?
>> Динамической

137. Область исходного кода программы, из которой допустим нормальный доступ к связанному с идентификатором объекту, называется?
>> Видимостью

138. Конструктором по умолчанию называется такой конструктор, который?
>> не принимает никаких аргументов.

139. Класс-наследник называется . от базового класса?
>> Производным.

140. Что следует ожидать на экране?
System.out.print(«A»+»B»+»C»);
System.out.println(‘A’+’B’+’C’);
>> ABC198

141. int j = 0;
for (int i = 0; i< 10; i++)
j = j++;
System.out.println(j);
Что выведется в результате?
>> 0

142. int x, y;
int i;
x = 1;
for (i = 0; i< 10; i++)

Что выведется в результате?
>> 3 5 7 9 11 13 15 17 19 21

143. int x, y;
int i;
x = 1;
for (i = 0; i< 10; i++)

Что выведется в результате?
>> 2 4 6 8 10 12 14 16 18 20

144. int x=0;
for(int count=10; count < 5; count++)
x += count ;>
Чему равна х?
>> 0

145. for(inti=-10; i
0) break;
System.out.print(i + » «) ;>,
Что выведется в результате?
>> -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0

147. Каков будет результат следующего примера?
Point p = new Point(1,2);
int a =p.x;
p = new Point(3,4);
System.out.println(a);
>> 1

148. Каков будет результат следующего примера?
Point p1 = new Point(3,4);
Point p2 = p1;
p1.x = 5;
p1 = new Point(4,4);
System.out.println(p2.x-p1.x);
>> 1

149. Каков будет результат следующих действий?
Point p1 = new Point(2,3);
Point p2 = new Point(2,3);
System.out.print(p1==p2);
p2=p1;
p1.x = 3;
System.out.print(» «);
System.out.println(p1==p2);
>> false true

150. Каков будет результат следующего примера?
public class testClass
public static void process (int x)

public static void main(String[] args)
int x=3; process(x);
System.out.println(x); >>
>> 3

151. Что будет напечатано в консоли в результате выполнения следующего кода:
System.out.println((byte)383+» «+(byte)384+» «+(byte)-384); ?
>> 127 -128 -128

152. Каков будет результат следующего примера?
char c = 65;
System.out.print(c);
System.out.print(+c);
System.out.print(«=»+c);
>> A65=A

153. Каков будет результат следующего примера?
class Parent
class Child extends Parent
public class testClass
public static void main(String[] args)
Child c = new Child(); System.out.print(c.a);
Parent p=c; System.out.print(p.a); >>
>> 32

154. Каков будет результат следующего примера?
class Parent
public void printX()>
class Child extends Parent
public class testClass
public static void main(String[] args)
new Child().printX(); >>
>> 0

155. Каков будет результат следующего примера?
class Parent
class Child extends Parent
public class testClass
public static void main(String[] args)
Child.a=10; Parent.a=5; System.out.println(Child.a); >>
>> 5

156. Каков будет результат следующего примера?
int i,j;
lab:for(i=0;i<6;i++)
for(j=3;j>1;j—)
if(i==j) > >
>> 2

157. Каков будет результат следующей программы?
public class testClass public static void main(String[] args) inti =5;
while(i=5) <
System.out.println(i++); >>>
>> Ошибка компиляции.

158. Каков будет результат следующего примера?
int b=5;
System.out.print(b+(b=3));
System.out.print((b=3)+3);b=5;
System.out.print(b+=(b=3));
>> 868

159. Дан код:
class Quest3
public static void main(String s[ ])
String args;
System.out.print(args + s);
>>
Результатом компиляции кода будет?
>> ошибка компиляции: переменная args используется до инициализации.

160. Дан код:
public class Quest5
public static void main()
System.out.print(«А«); >
public static void main(String args)
System.out.print(«Б«); >
public static void main(String[] args)
System.out.print(«В»);>>
Что будет выведено в результате компиляции и запуска?
>> B

161. Какие из следующихутверждений истинные?
a-nonstatic-метод не может быть вызван из статического метода;
b-static-метод не может быть вызван из нестатического метода;
c-private-метод не может быть вызван из другого метода этого класса;
d-final-метод не может быть статическим.
>> a

162. Дан код:
public class Quest5

static
Quest5()
public static void main(String[] args)
System.out.print(«4»); >>
В результате при компиляции и запуске будет выведено?
>> 24

163. Какие из объявлений корректны, если
classOwner
classInner
>>?
>> new Owner().new Inner();

164. Дан код:
public class Quest1
public static void main(String[] args)
String str = new String(«java»);
int i=1;
char j=3;
System.out.println(str.substring(i,j));>>
В результате при компиляции запуске будет выведено?
>>

165. Экземпляром какого класса является поле System.in?
>> java.io.InputStream;

166. Какой абстрактный класс является суперклассом для всех классов, используемых для чтения байтов?
>> InputStream

167. Какой интерфейс наиболее пригоден для создания класса, содержащего несортированные уникальные объекты?
>> Set

168. Дан код:



Какой код читает параметр count в переменную i?

>> int i = new Integer(getParameter(»count»)).intValue()

Список вопросов базы знаний

Что будет видно в окне, созданном при помощи приведенного кода?

import java.awt.*;
public class My public static void main(String arg[]) Frame f=new Frame();
f.setLayout(new CardLayout());
f.add(new Button(«A»),»First»);
f.add(new Button(«B»),»Second»);
f.add(new Button(«C»),»Thead»);
f.setSize(200,200);
f.setVisible(true);
>
>

?) Кнопки «A»,»B»,»C» в один столбик
?) Кнопки «A»,»B»,»C» в одну строчку
?) Ничего в окне не появится
Вопрос id:11352
Тема/шкала: Пакет NET
Какой менеджер компоновок позволяет разместить компоненты в таблице с ячейками равного размера?
?) FlowLayout
?) GridLayout
?) CardLayout
?) BorderLayout
Вопрос id:11353
Тема/шкала: Классы
Какой класс является родительским для потоков ввода данных?
?) DataStream
?) InputStream
?) FileInputStream
?) OutputStream
Вопрос id:11354
Тема/шкала: Основы синтаксиса
Каково максимальное значение для переменной типа byte?
?) зависит от интерпретатора
?) зависит от компилятора
Вопрос id:11355
Тема/шкала: Потоки ввода-вывода
Какой класс пакета java.io позволяет создать поток вывода текстовых данных с учетом кодировки?
?) FilterOutputStream
?) OutputStreamWriter
?) CharArrayWriter
?) OutputStream
Вопрос id:11356
Тема/шкала: Сервлеты / JSP

Какие результаты можно увидеть в окне при попытке компиляции и запуска следующей программы?

import java.awt.*;
public class My extends Frame public void paint(Graphics g) Font f=new Font(“Gothic”,Font.BOLD,24);
g.setFont(f);
g.drawString(“Hello”,20,20);
>
public static void main(String arg[]) My m=new My();
m.setSize(200,200);
m.setVisible(true);
>
>

?) программа откомпилируется и в окне появится слово Hello выведенное шрифтом по умолчанию
?) программа откомпилируется и в окне появится слово Hello выведенное шрифтом Gothic
?) программа не откомпилируется, так как шрифт Gothic не определен в Java

?) программа откомпилируется, но при попытке запуска возникнет исключительная ситуация типа NullPointerException

Вопрос id:11357
Тема/шкала: Потоки ввода-вывода

Исключительная ситуация какого типа возможна при открытии сокетного соединения следующим образом: Socket s=new Socket(«www.specialist.ru»,80);

?) IOException и MalformedURLException
?) только BadURLException
?) только IOException
?) только UnknownHostException
?) IOException и UnknownHostException
?) только MalformedURLException
Вопрос id:11358
Тема/шкала: Основы синтаксиса
Какие имена переменных допустимы?
Вопрос id:11359
Тема/шкала: Потоки ввода-вывода
Экземпляром какого класса является поле System.in?
?) java.lang.System
?) java.io.InputStreamWriter
?) java.io.InputStream
?) java.io.PrintStream
?) java.io.BufferedInputStream
Вопрос id:11360
Тема/шкала: Пакет NET
Какое выравнивание используется по умолчанию для компоновки FlowLayout?
?) FlowLayout.RIGHT
?) Выравнивание надо всегда указывать явно
?) FlowLayout.MIDDLE
?) FlowLayout.LEFT
?) FlowLayout.CENTER
Вопрос id:11361
Тема/шкала: Классы
Экземпляром какого класса является поле System.err?
?) java.io.ErrorStream
?) java.io.OutputStream
?) java.lang.System
?) java.io.PrintStream
Вопрос id:11362
Тема/шкала: Сервлеты / JSP

Что будет видно в окне, созданном при помощи нижеприведенного кода?

import java.awt.*;
public class My public static void main(String arg[]) Frame f=new Frame();
f.setLayout(new GridLayout(1,3,3,1));
f.add(new Button(«A»),»First»);
f.add(new Button(«B»),»Second»);
f.add(new Button(«C»),»Thead»);
f.setSize(400,400);
f.setVisible(true);
>
>

?) Ничего в окне не появится
?) Кнопки «A»,»B»,»C» в один столбик
?) Кнопки «A»,»B»,»C» в одну строчку
Вопрос id:11363
Тема/шкала: Основы синтаксиса
Сколько бит оперативной памяти занимает переменная типа char?
?) Объем выделяемой памяти зависит от компилятора
?) Объем выделяемой памяти зависит от интерпретатора
Вопрос id:11364
Тема/шкала: Сервлеты / JSP

Какие результаты можно увидеть на экране при попытке компиляции и запуска следующей программы?

class First int sum(int x,int y) return(x+y);
>
>
public class Second extends First public static void main(String a[]) Second s=new Second();
System.out.println(«Summa answer_variants»>

?) Программа не откомпилируется из-за невозможности создать объект экземпляр класса Second внутри класса Second

?) Программа не откомпилируется из-за того что метод sum не унаследуется классом Second

?) Программа не откомпилируется из-за отсутствия спецификатора доступа public в описании класса First

Вопрос id:11365
Тема/шкала: Потоки ввода-вывода
Какой класс необходимо использовать клиенту для соединения с сокетом сервера?
?) SocketServer
?) ServerSocket
Вопрос id:11366
Тема/шкала: Пакет SQL
Сколько типов драйверов баз данных различают в JDBC?
?) Никаких различий в типах драйверов не существует
Вопрос id:11367
Тема/шкала: Сервлеты / JSP

Какие результаты можно увидеть на экране при попытке компиляции и запуска следующей программы?

public class My int x=5, y=6;
class MyToo int sum() return(My.this.x+My.this.y);
>
>
public static void main(String arg[]) My m=new My();
My.MyToo mt=m.new MyToo();
System.out.println(«sum answer_variants»>

?) программа откомпилируется и при выполнении вернет null

?) программа не откомпилируется, так как методы вложенного класса не имеют спецификатора доступа public

?) программа не откомпилируется, так как поля x и y не доступны внутри класса MyToo

?) программа не откомпилируется, так как метод sum вложенного класса должен иметь спецификатор доступа static

?) программа откомпилируется и при выполнении вернет 11
?) программа не откомпилируется, так как неправильно создается объект экземпляр класса MyToo
?) программа откомпилируется и при выполнении вернет сообщение о ошибке
Вопрос id:11368
Тема/шкала: Сервлеты / JSP
В каком пакете находится интерфейс Servlet?
?) В пакете java.servlet
?) В пакете java.http
?) В пакете javax.servlet.http
?) В пакете javax.servlet
Вопрос id:11369
Тема/шкала: Основы синтаксиса

Какой результат появится на экране после выполнения следующей прграммы?

public class My public static void main(String arg[]) cko:
for(int i=0;i

?) Программа не откомпилируется из-за отсутствия спецификатора доступа public в описании интерфейса First

?) Программа не откомпилируется из-за недопустимости использования нестатических полей внутри статического метода

?) Программа не откомпилируется из-за отсутствия спецификатора доступа public в описании поля a внутри интерфейса First

?) Программа не откомпилируется из-за недопустимости присваивания нового значения полю a, так как это поле имеет спецификатор доступа final

?) Программа не откомпилируется из-за недопустимости описания полей внутри интерфейсного класса

?) Программа не откомпилируется из-за недопустимости присваивания значений полям интерфейсного класса

Вопрос id:11377
Тема/шкала: Классы

Какие результаты можно увидеть на экране при попытке компиляции и запуска следующей программы?

final class My public static void main(String a[]) System.out.println(«Hello!»);
>
>

Классы и объекты в Java

Java — объектно-ориентированный язык, а значит, программы состоят из объектов и классов. Разбираемся, что это такое.

Артём Авдеев

Артём Авдеев
Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.

Если в коде программы на объектно-ориентированном языке нужно отразить сущность каких-то объектов, используется понятие класса.

Возьмём пример из реального мира. У многих, вероятно, есть кошка, собака или хомячок, а у кого-то могут быть даже коровы, гуси, овцы. Любое из этих существ (объектов) можно охарактеризовать словами «домашнее животное» и у каждого есть свой набор атрибутов: вес, кличка, свой тип (корова, гусь, овца, собака и так далее). А ещё они, очевидно, могут есть и передвигаться.

Класс — это шаблонная конструкция, которая позволяет описать в программе объект, его свойства (атрибуты или поля класса) и поведение (методы класса).

Каждый класс имеет своё имя, чтобы в будущем к нему можно было обратиться. Чтобы создать класс на Java, необходимо написать слово class, дать ему название и поставить фигурные скобки:

class Pet

Имя класса в нашем примере — Pet.

Параметры класса

Мы можем создавать поля класса, каждое из которых имеет свой тип.

Поле класса — это переменная, которая описывает какое-либо из свойств данного класса.

Для наших домашних питомцев и полями класса будут вес, кличка и принадлежность к определённому типу (коровы, гуси, собаки и так далее). Очевидно, что здесь вес — это числовая переменная, а кличка и тип — строки символов. Тогда мы можем написать:

class Pet < int weight; String name; String type; >

Переменные weight, name и type — поля нашего класса Pet, то есть свойства, которые описывают объект этого класса. Таких полей может быть сколько угодно, каждое имеет свой тип, как обычная переменная.

Мы уже пару раз упомянули словосочетание «объект класса». Так говорят, потому что любой объект является экземпляром какого-либо класса. Здесь действует простая аналогия: класс — это как бы чертёж, который описывает объект, его устройство, а объект — реализация чертежа, его материальное воплощение.

Давайте запрограммируем первый объект класса Pet. Пусть это будет кот (type) с кличкой (name) Барсик и весом (weight) 10 (измерение в килограммах).

Сперва необходимо создать переменную типа Pet:

Pet pet;

Наш объект pet выглядит как обычная переменная, но в качестве типа указан класс Pet, и в данный момент в нём ничего нет. Инициализируем объект — воспользуемся такой синтаксической конструкцией:

Pet pet = new Pet();

Мы ставим знак равно, пишем ключевое слово new, имя нашего класса и круглые скобки. Принято говорить, что здесь мы вызываем конструктор класса Pet. Пока просто запомним это — о конструкторах и о том, как их использовать, будет рассказано в отдельной статье.

Теперь у нас появилась переменная pet типа Pet, в которой содержится объект класса Pet. Ранее в этом классе мы объявили поля, к которым можно обратиться и занести в них значения.

Чтобы получить доступ к какому-либо полю нашего класса Pet, нужно специальным образом обратиться к переменной pet — поставить точку и вызвать необходимое поле. Например, вот так:

Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10;

Теперь во всех трёх полях есть по значению, а мы можем получить их из программы, если потребуется, — например, распечатать в консоль:

Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10

Изменить значение в любом из полей класса также несложно. Пусть наш кот Барсик слегка потолстеет — добавим к его весу 1 кг:

Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); pet.weight = pet.weight + 1; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 11

Как видим, мы просто изменили вес в поле weight, а при выводе получили уже другое значение.

Методы класса

В начале статьи я упомянул, что наши домашние животные могут перемещаться и есть. В отличие от параметров вроде веса и клички, это уже не свойства объекта, а его функции. В классе эти функции обозначают как методы.

Метод класса — это блок кода, состоящий из ряда инструкций, который можно вызывать по его имени. Он обязательно содержит возвращаемый тип, название, аргументы и тело метода.

Синтаксис метода в Java:

возвращаемыйТип названиеМетода(аргументы) < //code return значение; >

Строка возвращаемыйТип показывает, какого типа данные вернёт метод. Например, если в качестве возвращаемого типа мы поставим тип String, то метод должен будет вернуть строку, а если int — целое число.

Чтобы вернуть значение из метода, используется специальное слово return. Если мы хотим, чтобы метод ничего не возвращал, то вместо возвращаемого типа нужно использовать специальное слово void.

Аргументы — то, что нужно передать в метод при его вызове. Мы можем указать сколько угодно параметров через запятую либо не указывать ни одного.

Для примера напишем простейший метод с именем sum (пока что не в нашем классе Pet), который складывает два переданных числа и возвращает их результат:

int sum(int a, int b) < int c = a + b; return c; >

Возвращаемый тип метода int, он указан перед именем sum. Далее идут два аргумента a и b, у обоих также указан тип int. Важно помнить, что возвращаемый тип и тип переменных не обязательно должны совпадать.

Аргументы метода работают как обычные переменные — за пределами метода к ним никак нельзя получить доступ. Внутри метода мы складываем значения из переменных a и b, записываем полученное значение в переменную c. После этого мы возвращаем значение переменной c — только оно доступно вне метода.

nt d = sum(1, 2); System.out.println(d); --OUTPUT> 3

Мы передали в метод sum два значения 1 и 2, а на выходе получили результат их сложения 3. Также можно создать метод, который принимает значение типа String, а возвращает длину этой строки:

int lengthOfString(String str) < return str.length(); >

В этом случае у нас возвращаемый типа int, а параметр str — типа String.

Попробуем использовать этот метод:

String t = "Any field"; int d = lengthOfString(t); System.out.println(d); --OUTPUT> 9

Также мы можем создать метод, который ничего не возвращает, а просто печатает переданное слово в консоль:

void printString(String str) < System.out.println(str); >

Либо метод, который ничего не принимает на вход, а просто печатает «Привет!»:

void sayHello() < System.out.println("Привет!"); >

В методах, которые ничего не возвращают, слово return можно опустить.

Обратите внимание, что return полностью прекращает выполнение метода:

void printIfMoreFive(int num) < if (num 5) < return; > System.out.println("Привет"); >

Теперь попробуем вызвать этот метод, передав в него число 3:

printIfMoreFive(3); --OUTPUT> 

В этом случае мы ничего не увидим в консоли, так как 3 меньше 5, а значит, отработает блок if и произойдёт выход из метода с помощью слова return.

Но если передадим 6, увидим нашу надпись «Привет!»:

printIfMoreFive(6); --OUTPUT> Привет!

Методы в классах

Теперь, когда мы разобрались, что такое методы, давайте создадим два метода — eat и run — в классе Pet.

Пусть первый из них принимает на вход параметр типа int и увеличивает на это значение поле weight (сколько скушал питомец, на столько и потолстел). А после этого печатает в консоль «Я поел» и возвращает новый вес.

Второй из методов run пусть уменьшает вес на 1, но только если он больше 5, и печатает в консоль: «Я бегу». Иначе, если вес меньше или равен 5: «Я не могу бежать».

class Pet < int weight; String name; String type; int eat(int amount) < weight += amount; System.out.println("Я поел"); return weight; > void run( ) < if (weight 5) < System.out.println("Я не могу бежать"); return; > weight--; System.out.println("Я бегу"); > >

Теперь мы можем вызвать эти методы у объектов класса Pet. Чтобы это сделать, нужно обратиться к объекту, поставить точку и таким способом вызвать необходимый метод.

Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); System.out.println("Кот поел и теперь весит " + pet.eat(2) + " кг"); for (int i = 0; i < 8; i++) < pet.run(); >System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Я поел --OUTPUT> Кот поел и теперь весит 12 кг --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я не могу бежать --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 5

Иногда в каком-то методе требуется создать параметр, у которого имя совпадает с именем поля класса. В таких случаях, чтобы обратиться внутри метода именно к полю класса, а не к параметру нашего метода, используется ключевое слово this.

Для иллюстрации этого создадим метод, setName, который будет устанавливать переданное значение в поле name, а затем сообщать в консоль, что нашего питомца теперь зовут по-другому.

class Pet < int weight; String name; String type; int eat(int amount) < weight += amount; System.out.println("Я поел"); return weight; > void run( ) < if (weight 5) < System.out.println("Я не могу бежать"); return; > weight--; System.out.println("Я бегу"); > void setName(String name) < this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); > >

В результате с помощью this.name мы обращаемся к полю name и заносим в него значение из параметра метода name.

Также мы можем вызывать один метод вслед за другим. Давайте сделаем так, чтобы метод eat возвращал текущее животное с помощью this.

class Pet < int weight; String name; String type; int amountOfFood; Pet eat(int amount) < weight += amount; System.out.println("Я поел"); amountOfFood += amount; return this; > void run( ) < if (weight 5) < System.out.println("Я не могу бежать"); return; > weight--; System.out.println("Я бегу"); > >

Теперь мы можем написать так:

Pet pet = new Pet(); pet.eat(1).eat(1).run();

Здесь мы дважды вызываем метод eat у одного и того же объекта класса (кота), а следом за ним вызываем метод run. И все эти вызовы делаются последовательно в одной строке, через точку.

Статические поля и методы

С помощью специального слова static мы можем создать статические поля и методы. Эти поля и методы описывают уже не объект класса, а сам класс. То есть они вызываются по имени класса, а их значение — общее для всех объектов данного класса.

Например, мы хотим посчитать, сколько еды съели все домашние животные. Введём поле amountOfAllFood типа int и добавим к нему слово static. А также введём нестатическое поле amountOfFood. Изменять данные поля мы будем в методе eat.

class Pet < int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) < weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; > void run( ) < if (weight 5) < System.out.println("Я не могу бежать"); return; > weight--; System.out.println("Я бегу"); > void setName(String name) < this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); > >

Теперь попробуем создать двух животных, и пусть каждое из них поест.

Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + Pet.amountOfAllFood); cat.eat(4); dog.eat(6); System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + Pet.amountOfAllFood); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Сколько животное съело: 0 --OUTPUT> Домашнее животное: Собака --OUTPUT> Кличка: Тузик --OUTPUT> Вес: 15 --OUTPUT> Сколько животное съело: 0 --OUTPUT> Общее количество съеденной еды: 0 --OUTPUT> Я поел --OUTPUT> Я поел --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 14 --OUTPUT> Сколько животное съело: 4 --OUTPUT> Домашнее животное: Собака --OUTPUT> Кличка: Тузик --OUTPUT> Вес: 21 --OUTPUT> Сколько животное съело: 6 --OUTPUT> Общее количество съеденной еды: 10

Как видите, к полю amountOfAllFood мы обращаемся уже не через объект, а по имени класса, и в этом поле хранится общее количество съеденной еды. Зато в поле amountOfFood у каждого животного — именно своё количество съеденной еды.

Мы можем обратиться к полю amountOfAllFood и через объект — результат будет тот же. Но принято обращаться именно через имя класса:

Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + cat.amountOfAllFood); cat.eat(4); dog.eat(6); System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + dog.amountOfAllFood);

Как вы могли заметить, в нашем примере постоянно дублируется код с выводом информации об объекте. Давайте вынесем его в отдельный метод в классе Pet:

class Pet < int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) < weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; > void run( ) < if (weight 5) < System.out.println("Я не могу бежать"); return; > weight--; System.out.println("Я бегу"); > void setName(String name) < this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); > void printInfo( ) < System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); > >

Теперь нам достаточно лишь обратиться к методу printInfo через объект, о котором мы хотим получить информацию.

Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; cat.printInfo();

Но у нас есть ещё строка с выводом общего количества еды. Можем ли мы поместить её в метод printInfo? Да, оказывается, можем:

class Pet < int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) < weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; > void run( ) < if (weight 5) < System.out.println("Я не могу бежать"); return; > weight--; System.out.println("Я бегу"); > void setName(String name) < this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); > void printInfo( ) < System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); System.out.println("Общее количество съеденной еды: " + amountOfAllFood); > >

Всё хорошо, но теперь при каждом вызове printInfo у нас будет печататься информация об общем количестве еды. Чтобы этого избежать, лучше вынести строку в отдельный статический метод:

class Pet < int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) < weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; > void run( ) < if (weight 5) < System.out.println("Я не могу бежать"); return; > weight--; System.out.println("Я бегу"); > void setName(String name) < this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); > void printInfo( ) < System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); > static void printStaticInfo( ) < System.out.println("Общее количество съеденной еды: " + amountOfAllFood); > >

У статического метода printStaticInfo также нет никаких отличий от обычного метода, но он относится к классу, а не к объекту данного класса. Вызываем его через обращение к классу:

Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; cat.printInfo(); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; dog.printInfo(); Pet.printStaticInfo(); cat.eat(4); dog.eat(6); cat.printInfo(); dog.printInfo(); Pet.printStaticInfo();

Важно заметить, что из метода printStaticInfo мы можем обратиться только к статическим полям. Это происходит потому, что нестатические поля существуют в рамках конкретного объекта класса, а статический метод — в рамках всего класса.

Но можно добавить параметр типа Pet в данный метод — тогда у этого параметра мы будем вызывать необходимые поля. Например, так:

static void printStaticInfo(Pet pet) < System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight + "\nСколько животное съело: " + pet.amountOfFood); System.out.println("Общее количество съеденной еды: " + amountOfAllFood); >
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; Pet.printStaticInfo(cat); Pet.printStaticInfo(dog); cat.eat(4); dog.eat(6); Pet.printStaticInfo(cat); Pet.printStaticInfo(dog);

Подытожим

  • что такое классы, из чего они состоят;
  • как создавать объекты класса;
  • что такое методы, какая у них сигнатура и как их вызывать;
  • как использовать статические поля и методы классов.

Важные примечания

Работать с классами и объектами в языке Java несложно, но есть несколько важных правил-примечаний, на которые нужно обратить внимание:

  1. Классы создаются в файлах с расширением .java. Главный класс должен называться так же, как имя файла. Например, в файле Main.java — класс Main.
  2. Разные классы в одном проекте могут иметь одинаковые имена, для этого им надо располагаться в разных пакетах (package).
  3. Нельзя создать метод или объявить переменную за пределами классов.
  4. Каждый раз мы начинаем программу со статического метода main, который имеет возвращаемый тип int, а в параметрах у него указана переменная args типа String[] (массив строк).
  5. Статические поля нужно использовать правильно. Например, можно с помощью статического поля сделать счётчик количества созданных объектов — он описывает именно класс, в котором расположен, а не сами объекты данного класса. Но нет смысла делать статическим поле, описывающее объект, если не можете придумать, как использовать информацию из этого поля в другом классе.

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

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