close

Вход

Забыли?

вход по аккаунту

?

4. Введение в Java. Класс.

код для вставки
Введение в Java
Класс
Нечаев Михаил
Домашняя работа #3
2
/**
* Метод проверяющий скобочную последовательность на правильность.
* <p>
* Пустая строка
* — правильная скобочная последовательность.
* Правильная скобочная последовательность, взятая в скобки одного типа
* — правильная скобочная последовательность.
* Правильная скобочная последовательность,
* к которой слева или справа приписана правильная скобочная последовательность
* — правильная скобочная последовательность.
* <p>
* Скобки бывают:
* 1. Круглые '(', ')'
* 2. Квадратные '[', ']'
* 3. Фигурные '{', '}'
*
* @param sequence — входная строка
* @return {@code true} — если скобочная последовательность корректна и {@code false} иначе
* @throws IllegalArgumentException если в строке содержатся символы, не являющиеся
скобками
*/
Сегодня
-
Класс
Приведение типов
Методы
Инициализация параметров
Вложенные классы
Домашняя
3
Класс
4
class SimpleClass {
}
Класс
- Класс
- базовая сущность в языке
5
Класс
- Класс
- базовая сущность в языке
- шаблон объекта
6
Класс
- Класс
- базовая сущность в языке
- шаблон объекта
- объект == экземпляр класса
7
Класс
- Класс
- базовая сущность в языке
- шаблон объекта
- объект == экземпляр класса
- содержит данные
8
Класс
- Класс
- базовая сущность в языке
- шаблон объекта
- объект == экземпляр класса
- содержит данные
- и методы взаимодействующими с ними
9
Класс
- Класс
- базовая сущность в языке
- шаблон объекта
- объект == экземпляр класса
- содержит данные
- и методы взаимодействующими с ними
- интерфейс* для своих данных
10
Класс
- Класс
- базовая сущность в языке
- шаблон объекта
- объект == экземпляр класса
- содержит данные
- и методы взаимодействующими с ними
- интерфейс* для своих данных
- каркас объекта, описывающий внутренние взаимосвязи
11
Класс
- Класс
- базовая сущность в языке
- шаблон объекта
- объект == экземпляр класса
- содержит данные
- и методы взаимодействующими с ними
- интерфейс* для своих данных
- каркас объекта, описывающий внутренние взаимосвязи
- объект — физическая сущность
- занимает место в памяти
12
Класс
13
public /* ? access modifier */ class /* keyword */ ClassTemplate /* classname */ {
public /* ? access modifier */ int /* type */ varX /* instance variable */;
private /* ? access modifier */ String /* type */ varS /* instance variable */;
static double varD /* class variable */ = 0.5F /* default value */;
//default implicit constructor -> implicit extends Object
/*
public ClassTemplate() {
super();
}
*/
int /* type */ getVarX /* method name */(/* parameter list */) {
// body of method
return varX;
}
void /* type */ setVarS /* method name */(String varS /* parameter list */) {
// body of method
this.varS = varS;
}
public static void main(String[] args) {
ClassTemplate /* classname */ classTemplate1 /* class var */; // == null
classTemplate1 /* class var */ = new ClassTemplate /* classname */(/* constructor */);
}
}
ClassTemplate classTemplate2 = new ClassTemplate();
Класс
- static поля — принадлежат… <классу/экземпляру класса>?
14
Класс
15
class DataClass {
int var1;
static int var2;
}
class DataClassMain {
public static void main(String[] args) {
DataClass dataClass = new DataClass();
System.out.println(dataClass.var1); //== 0
System.out.println(dataClass.var2); //== 0. Wrong!
System.out.println(DataClass.var2); //== 0. OK!
dataClass.var1 = 5;
dataClass.var2 = 10; //Wrong!
DataClass.var2 = 11; //OK!
System.out.println(dataClass.var1); //== 5
System.out.println(DataClass.var2); //== 11
}
}
Класс
- static поля — принадлежат… классу, а не экземпляру класса
16
Класс
- static поля — принадлежат… классу, а не экземпляру класса
- static методы — принадлежат… <классу / экземпляру класса>?
17
Класс
18
static void checkArgs(int from, int to) {
. . .
}
Класс
private static AbstractFizzBuzzGame stubFizzBuzzGame = new AbstractFizzBuzzGame() {
@Override
void print(String word) {
throw new UnsupportedOperationException("todo: implement this");
}
@Override
void flush() {
throw new UnsupportedOperationException("todo: implement this");
}
};
// AbstractFizzBuzzGame.checkArgs(0, 0);
19
Класс
- static поля — принадлежат… классу, а не экземпляру класса
- static методы — принадлежат… классу, а не экземпляру класса
20
Класс
- static поля — принадлежат… классу, а не экземпляру класса
- static методы — принадлежат… классу, а не экземпляру класса
Итого:
- Из static методов доступны только
- static поля
- static методы
- Из обычных методов доступны
- как обычные методы и поля
- так и static методы и static поля
21
Класс
- Параметры в метод передаются по… <ссылке / значению>?
22
Класс
23
public class ClassWithMethod1 {
private String varS = "ABC";
private String modifyS(String varS) {
varS = "BCD";
return varS + "ED";
}
public static void main(String[] args) {
ClassWithMethod1 cwm = new ClassWithMethod1();
System.out.println(cwm.varS); // ABC
String varS = cwm.varS;
String res = cwm.modifyS(varS);
}
}
System.out.println(cwm.varS);
System.out.println(varS);
System.out.println(res);
Класс
24
public class ClassWithMethod1 {
private String varS = "ABC";
private String modifyS(String varS) {
varS = "BCD";
return varS + "ED";
}
public static void main(String[] args) {
ClassWithMethod1 cwm = new ClassWithMethod1();
System.out.println(cwm.varS); // ABC
String varS = cwm.varS;
String res = cwm.modifyS(varS);
}
}
System.out.println(cwm.varS); //ABC
System.out.println(varS); //ABC
System.out.println(res); //BCDED
Класс
25
public class ClassWithMethod2 {
private String varS = "ABC";
private String modifyS(String varS) {
this.varS = "BCD";
return varS + "ED";
}
public static void main(String[] args) {
ClassWithMethod2 cwm = new ClassWithMethod2();
System.out.println(cwm.varS); // ABC
String varS = cwm.varS;
String res = cwm.modifyS(varS);
}
}
System.out.println(varS);
System.out.println(cwm.varS);
System.out.println(res);
Класс
26
public class ClassWithMethod2 {
private String varS = "ABC";
private String modifyS(String varS) {
this.varS = "BCD";
return varS + "ED";
}
public static void main(String[] args) {
ClassWithMethod2 cwm = new ClassWithMethod2();
System.out.println(cwm.varS); // ABC
String varS = cwm.varS;
String res = cwm.modifyS(varS);
}
}
System.out.println(varS); // ABC
System.out.println(cwm.varS); // BCD
System.out.println(res); // ABCED
Класс
- Параметры в метод передаются по… значению
27
Приведение типов
- Правила повышения типов
Chapter 5. Conversions and Contexts
28
Приведение типов
- Правила повышения типов
- примитивы
29
Приведение типов
30
public class PrimitiveVars11 {
private static void print(byte x) {
System.out.println("byte: " + x);
}
private static void print(short x) {
System.out.println("short: " + x);
}
private static void print(int x) {
System.out.println("int: " + x);
}
private static void print(float x) {
System.out.println("float: " + x);
}
private static void print(double x) {
System.out.println("double: " + x);
}
}
public static void main(String[] args) {
print((byte) 0);
print((short) 0);
print((int) 0);
print((float) 0);
print((double) 0);
}
Приведение типов
31
public class PrimitiveVars12 {
private static void print(short x) {
System.out.println("short: " + x);
}
private static void print(int x) {
System.out.println("int: " + x);
}
private static void print(float x) {
System.out.println("float: " + x);
}
private static void print(double x) {
System.out.println("double: " + x);
}
}
public static void main(String[] args) {
print((byte) 0);
print((short) 0);
print((int) 0);
print((float) 0);
print((double) 0);
}
Приведение типов
32
public class PrimitiveVars13 {
private static void print(int x) {
System.out.println("int: " + x);
}
private static void print(float x) {
System.out.println("float: " + x);
}
private static void print(double x) {
System.out.println("double: " + x);
}
}
public static void main(String[] args) {
print((byte) 0);
print((short) 0);
print((int) 0);
print((float) 0);
print((double) 0);
}
Приведение типов
33
public class PrimitiveVars14 {
private static void print(float x) {
System.out.println("float: " + x);
}
private static void print(double x) {
System.out.println("double: " + x);
}
}
public static void main(String[] args) {
print((byte) 0);
print((short) 0);
print((int) 0);
print((float) 0);
print((double) 0);
}
Приведение типов
34
public class PrimitiveVars15 {
private static void print(double x) {
System.out.println("double: " + x);
}
}
public static void main(String[] args) {
print((byte) 0);
print((short) 0);
print((int) 0);
print((float) 0);
print((double) 0);
}
Приведение типов
public class PrimitiveVars21 {
private static void byte_(byte x) {
System.out.println("byte: " + x);
}
private static void short_(short x) {
System.out.println("short: " + x);
}
private static void int_(int x) {
System.out.println("int: " + x);
}
private static void float_(float x) {
System.out.println("float: " + x);
}
}
private static void double_(double x) {
System.out.println("double: " + x);
}
35
byte_((byte) 0);
short_((byte) 0);
int_((byte) 0);
float_((byte) 0);
double_((byte) 0);
byte_((short) 0);
short_((short) 0);
int_((short) 0);
float_((short) 0);
double_((short) 0);
byte_((int) 0);
short_((int) 0);
int_((int) 0);
float_((int) 0);
double_((int) 0);
byte_((float) 0);
short_((float) 0);
int_((float) 0);
float_((float) 0);
double_((float) 0);
byte_((double) 0);
short_((double) 0);
int_((double) 0);
float_((double) 0);
double_((double) 0);
Приведение типов
public class PrimitiveVars21 {
private static void byte_(byte x) {
System.out.println("byte: " + x);
}
private static void short_(short x) {
System.out.println("short: " + x);
}
private static void int_(int x) {
System.out.println("int: " + x);
}
private static void float_(float x) {
System.out.println("float: " + x);
}
}
private static void double_(double x) {
System.out.println("double: " + x);
}
36
byte_((byte) 0);
short_((byte) 0);
int_((byte) 0);
float_((byte) 0);
double_((byte) 0);
//byte_((short) 0);
short_((short) 0);
int_((short) 0);
float_((short) 0);
double_((short) 0);
//byte_((int) 0);
//short_((int) 0);
int_((int) 0);
float_((int) 0);
double_((int) 0);
//byte_((float) 0);
//short_((float) 0);
//int_((float) 0);
float_((float) 0);
double_((float) 0);
//byte_((double) 0);
//short_((double) 0);
//int_((double) 0);
//float_((double) 0);
double_((double) 0);
Приведение типов
- Правила повышения типов
- примитивы
- byte — short, int, long, float, double
- short — int, long, float, double
- int — long, float, double
- long — float, double
- float — double
37
Приведение типов
- Правила повышения типов
- примитивы
- byte — short, int, long, float, double
- short — int, long, float, double
- int — long, float, double
- long — float, double
- float — double
- char — ?
38
Приведение типов
- Правила повышения типов
- примитивы
- byte — short, int, long, float, double
- short — int, long, float, double
- int — long, float, double
- long — float, double
- float — double
- char — int, long, float, double
39
Приведение типов
- Правила повышения типов
- примитивы
- boxing
40
Приведение типов
41
public class PrimitiveVars31 {
private static void int_(int x) {
System.out.println("int: " + x);
}
private static void integer_(Integer x) {
System.out.println("Integer: " + x);
}
public static void main(String[] args) {
int intX = 0;
Integer integerX = Integer.valueOf(0);
int_(intX);
int_(integerX);
}
}
integer_(intX);
integer_(integerX);
Приведение типов
- Правила повышения типов
- примитивы
- boxing
- boolean — Boolean
- byte — Byte
- short — Short
- char — Character
- int — Integer
- long — Long
- float — Float
- double — Double
42
Приведение типов
- Правила понижения типов
- примитивы
43
Приведение типов
44
public class PrimitiveVars41 {
}
public static void main(String[] args) {
double d = 352115.456D; //101_0101_1111_0111_0011
System.out.println((byte) d);
System.out.println((short) d);
System.out.println((char) d);
System.out.println((int) d);
System.out.println((long) d);
System.out.println((float) d);
}
Приведение типов
45
public class PrimitiveVars41 {
}
public static void main(String[] args) {
double d = 352115.456D; //101_0101_1111_0111_0011
System.out.println((byte) d); //115
System.out.println((short) d); //24435
System.out.println((char) d); //⼻彳
System.out.println((int) d); //352115
System.out.println((long) d); //352115
System.out.println((float) d); //352115.47
}
Приведение типов
46
public class PrimitiveVars42 {
}
public static void main(String[] args) {
double d = 352115.456D; //101_0101_1111_0111_0011
System.out.println(Long.toBinaryString((byte) d));
System.out.println(Long.toBinaryString((short) d));
System.out.println(Long.toBinaryString((char) d));
System.out.println(Long.toBinaryString((int) d));
}
Приведение типов
47
public class PrimitiveVars42 {
}
public static void main(String[] args) {
//101_0101_1111_0111_0011
double d = 352115.456D;
//
111_0011
System.out.println(Long.toBinaryString((byte) d));
//
101_1111_0111_0011
System.out.println(Long.toBinaryString((short) d));
//
101_1111_0111_0011
System.out.println(Long.toBinaryString((char) d));
//101_0101_1111_0111_0011
System.out.println(Long.toBinaryString((int) d));
}
Приведение типов
- Правила понижения типов
- примитивы
- short — byte / char
- char — byte / short
- int — byte / short / char
- long — byte / short / char / int
- float — byte / short / char / int / long
- double — byte / short / char / int / long / float
48
Приведение типов
- Правила понижения типов
- примитивы
- unboxing
49
Приведение типов
- Правила понижения типов
- примитивы
- unboxing
- Boolean — boolean
- Byte — byte
- Short — short
- Character — char
- Integer — int
- Long — long
- Float — float
- Double — double
50
Приведение типов
- Почему в правилах повышения нет byte —> char?
51
Приведение типов
- Почему в правилах повышения нет byte —> char?
- Повышение + понижение
52
Приведение типов
- Почему в правилах повышения нет byte —> char?
- Повышение + понижение
- Повышение byte — int
- Понижение int — char
53
Методы
54
- Что это?
public class PrimitiveVars11 {
private static void print(byte x) {
System.out.println("byte: " + x);
}
private static void print(short x) {
System.out.println("short: " + x);
}
private static void print(int x) {
System.out.println("int: " + x);
}
private static void print(float x) {
System.out.println("float: " + x);
}
}
private static void print(double x) {
System.out.println("double: " + x);
}
Методы
- Что это?
- перегруженный метод
55
public class PrimitiveVars11 {
private static void print(byte x) {
System.out.println("byte: " + x);
}
private static void print(short x) {
System.out.println("short: " + x);
}
private static void print(int x) {
System.out.println("int: " + x);
}
private static void print(float x) {
System.out.println("float: " + x);
}
}
private static void print(double x) {
System.out.println("double: " + x);
}
Методы
- Что это?
- перегруженный метод
- одинаковое название
- разные параметры
56
public class PrimitiveVars11 {
private static void print(byte x) {
System.out.println("byte: " + x);
}
private static void print(short x) {
System.out.println("short: " + x);
}
private static void print(int x) {
System.out.println("int: " + x);
}
private static void print(float x) {
System.out.println("float: " + x);
}
}
private static void print(double x) {
System.out.println("double: " + x);
}
Методы
57
public class MethodOverload {
public void method() {
System.out.println("1");
}
public void method(int x) {
System.out.println("2");
}
public void method(int x, int y) {
System.out.println("3");
}
public int method(int x) {
System.out.println("4");
return 0;
}
public int method(int x, int y, int z) {
System.out.println("5");
return 0;
}
public int method(int... x) {
System.out.println("6");
return x.length;
}
}
Методы
public class MethodOverload {
58
public class MethodOverload {
public void method() {
System.out.println("1");
}
public void method() {
System.out.println("1");
}
/*
public void method(int x) {
System.out.println("2");
}
*/
public void method(int x) {
System.out.println("2");
}
public void method(int x, int y) {
System.out.println("3");
}
public void method(int x, int y) {
System.out.println("3");
}
}
public int method(int x) {
System.out.println("4");
return 0;
}
/*
public int method(int x) {
System.out.println("4");
return 0;
}
*/
public int method(int x, int y, int z) {
System.out.println("5");
return 0;
}
public int method(int x, int y, int z) {
System.out.println("5");
return 0;
}
public int method(int... x) {
System.out.println("6");
return x.length;
}
public int method(int... x) {
System.out.println("6");
return x.length;
}
}
Методы
- Перегрузка методов — полиморфизм
59
Методы
- Перегрузка методов — полиморфизм
- Полиморфизм — способность метода обрабатывать данные
разных типов
60
Методы
- Перегрузка методов — полиморфизм
- Полиморфизм — способность метода обрабатывать данные
разных типов
- Разные возвращаемые типы, одинаковые параметры
- Не работает
61
Методы
- Перегрузка методов — полиморфизм
- Полиморфизм — способность метода обрабатывать данные
разных типов
- Разные возвращаемые типы, одинаковые параметры
- Не работает
- Перегруженные методы должны различаться по
- типу параметров
- и/или
- количеству параметров
62
Методы
63
public int method(int x) {
System.out.println("4");
return 0;
}
public int method(int x, int y, int z) {
System.out.println("5");
return 0;
}
public int method(int... x) {
System.out.println("6");
return x.length;
}
Методы
- Перегрузка методов — полиморфизм
- Полиморфизм — способность метода обрабатывать данные
разных типов
- Разные возвращаемые типы, одинаковые параметры
- Не работает
- Перегруженные методы должны различаться по
- типу параметров
- и/или
- количеству параметров
- varargs методы — переменное количество переменных
64
Методы
- Перегрузка методов — полиморфизм
- Полиморфизм — способность метода обрабатывать данные
разных типов
- Разные возвращаемые типы, одинаковые параметры
- Не работает
- Перегруженные методы должны различаться по
- типу параметров
- и/или
- количеству параметров
- varargs методы — переменное количество переменных
- внутри метода ведёт себя как массив
65
Методы
- Перегрузка методов — полиморфизм
- Полиморфизм — способность метода обрабатывать данные
разных типов
- Разные возвращаемые типы, одинаковые параметры
- Не работает
- Перегруженные методы должны различаться по
- типу параметров
- и/или
- количеству параметров
- varargs методы — переменное количество переменных
- внутри метода ведёт себя как массив
- такой параметр должен стоять последним
- в методе может быть только один
66
Методы
- Перегрузка методов — полиморфизм
- Полиморфизм — способность метода обрабатывать данные
разных типов
- Разные возвращаемые типы, одинаковые параметры
- Не работает
- Перегруженные методы должны различаться по
- типу параметров
- и/или
- количеству параметров
- varargs методы — переменное количество переменных
- внутри метода ведёт себя как массив
- такой параметр должен стоять последним
- в методе может быть только один
- у такого метода самый низкий приоритет
67
Инициализация параметров
- Конструктор
68
Инициализация параметров
- Конструктор
public class Rectangle1 {
private int width;
private int height;
public int getSquare() {
return width * height;
}
}
public static void main(String[] args) {
Rectangle1 rectangle1 = new Rectangle1();
rectangle1.width = 1;
rectangle1.height = 2;
System.out.println(rectangle1.getSquare());
}
69
Инициализация параметров
70
- Конструктор
public class Rectangle2 {
public class Rectangle1 {
private int width;
private int height;
private int width;
private int height;
public Rectangle2(int width, int height) {
this.width = width;
this.height = height;
}
public int getSquare() {
return width * height;
}
}
public int getSquare() {
return width * height;
}
public static void main(String[] args) {
Rectangle1 rectangle1 = new Rectangle1();
rectangle1.width = 1;
rectangle1.height = 2;
System.out.println(rectangle1.getSquare());
}
}
public static void main(String[] args) {
Rectangle2 rectangle1 = new Rectangle2(2, 3);
System.out.println(rectangle1.getSquare());
}
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
71
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
- Имя совпадает с названием класса
72
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
- Имя совпадает с названием класса
- Сигнатура похожа на метод
73
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
- Имя совпадает с названием класса
- Сигнатура похожа на метод
- По хорошему, конструктор должен сделать класс полностью
пригодным к использованию
74
Инициализация параметров
75
public class Rectangle2 {
private int width;
private int height;
}
public Rectangle2(int width, int height) {
this.width = width;
this.height = height;
}
public class Rectangle4 {
private int width;
private int height;
}
public Rectangle4(int w, int h) {
width = w;
height = h;
}
public class Rectangle3 {
private int width;
private int height;
}
public Rectangle3(int width, int height) {
width = width;
height = height;
}
Инициализация параметров
76
public class Rectangle2 {
private int width;
private int height;
}
public Rectangle2(int width, int height) {
this.width = width;
this.height = height;
}
public class Rectangle4 {
private int width;
private int height;
}
public Rectangle4(int w, int h) {
width = w;
height = h;
}
public class Rectangle3 {
private int width;
private int height;
}
public Rectangle3(int width, int height) {
width = width;
height = height;
}
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
- Имя совпадает с названием класса
- Сигнатура похожа на метод
- По хорошему, конструктор должен сделать класс полностью
пригодным к использованию
- this для параметров — чтобы не было сокрытия имён
77
Инициализация параметров
78
public class Rectangle5 {
private final int width;
private final int height;
}
public Rectangle5(int width) {
this.width = width;
}
public class Rectangle5 {
private final int width;
private final int height = 5;
public class Rectangle5 {
private final int width = 1;
private final int height = 5;
}
public Rectangle5(int width) {
this.width = width;
}
}
public Rectangle5(int width) {
this.width = width;
}
Инициализация параметров
79
public class Rectangle5 {
private final int width;
private final int height;
}
public Rectangle5(int width) {
this.width = width;
}
public class Rectangle5 {
private final int width;
private final int height = 5;
public class Rectangle5 {
private final int width = 1;
private final int height = 5;
}
public Rectangle5(int width) {
this.width = width;
}
}
public Rectangle5(int width) {
this.width = width;
}
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
- Имя совпадает с названием класса
- Сигнатура похожа на метод
- По хорошему, конструктор должен сделать класс полностью
пригодным к использованию
- this для параметров — чтобы не было сокрытия имён
- final переменные можно инициализировать в конструкторе
80
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
- Имя совпадает с названием класса
- Сигнатура похожа на метод
- По хорошему, конструктор должен сделать класс полностью
пригодным к использованию
- this для параметров — чтобы не было сокрытия имён
- final переменные можно инициализировать в конструкторе
- но инициализация должна быть только одна
81
Инициализация параметров
public class Rectangle5 {
private final int width;
private final int height;
}
public Rectangle5(int width, int height) {
this.width = width;
this.height = height;
}
82
Инициализация параметров
83
public class Rectangle6 {
private final int width;
private final int height;
private final String name;
public Rectangle6() {
this.width = 10;
this.height = 20;
this.name = "Rectangle6";
}
public Rectangle6(String name) {
this.width = 10;
this.height = 20;
this.name = name;
}
public Rectangle6(int width, int height) {
this.width = width;
this.height = height;
this.name = "Rectangle6";
}
public Rectangle6(int width) {
this.width = width;
this.height = width;
this.name = "Rectangle6";
}
public Rectangle6(int width, int height, String name) {
this.width = width;
this.height = height;
this.name = name;
}
}
Инициализация параметров
84
public class Rectangle6 {
private final int width;
private final int height;
private final String name;
Что делать с дублированием кода?
public Rectangle6() {
this.width = 10;
this.height = 20;
this.name = "Rectangle6";
}
public Rectangle6(String name) {
this.width = 10;
this.height = 20;
this.name = name;
}
public Rectangle6(int width, int height) {
this.width = width;
this.height = height;
this.name = "Rectangle6";
}
public Rectangle6(int width) {
this.width = width;
this.height = width;
this.name = "Rectangle6";
}
public Rectangle6(int width, int height, String name) {
this.width = width;
this.height = height;
this.name = name;
}
}
Инициализация параметров
public class Rectangle7 {
private final int width;
private final int height;
private final String name;
public Rectangle7() {
this(10, 20, "Rectangle7");
}
public Rectangle7(String name) {
this(10, 20, name);
}
public Rectangle7(int width) {
this(width, width, "Rectangle7");
}
public Rectangle7(int width, int height) {
this(width, height, “Rectangle7");
}
}
public Rectangle7(int width, int height, String name) {
this.width = width;
this.height = height;
this.name = name;
}
85
Инициализация параметров
public class Rectangle8 {
private static final int DEFAULT_WIDTH = 10;
private static final int DEFAULT_HEIGHT = 10;
private static final String DEFAULT_NAME = "Rectangle8";
private final int width;
private final int height;
private final String name;
public Rectangle8() {
this(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_NAME);
}
public Rectangle8(String name) {
this(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_NAME);
}
public Rectangle8(int width) {
this(width, width, DEFAULT_NAME);
}
public Rectangle8(int width, int height) {
this(width, height, DEFAULT_NAME);
}
}
public Rectangle8(int width, int height, String name) {
this.width = width;
this.height = height;
this.name = name;
}
86
Инициализация параметров
- Конструктор
- Инициализация полей при создании экземпляра
- Имя совпадает с названием класса
- Сигнатура похожа на метод
- По хорошему, конструктор должен сделать класс полностью
пригодным к использованию
- this для параметров — чтобы не было сокрытия имён
- final переменные можно инициализировать в конструкторе
- но инициализация должна быть только одна
- this для конструктора
- первая операция в конструкторе
- вызов другого конструктора
87
Инициализация параметров
public class Rectangle9 {
private final int width;
private final int height;
private String name;
public Rectangle9(int width, int height) {
this.width = width;
this.height = height;
}
}
public Rectangle9(int width, int height, String name) {
this(width, height);
this.name = name;
}
88
Инициализация параметров
- Инициализация полей
89
Инициализация параметров
90
public class ClassWithParameters {
{
}
static {
var7 = 9;
System.out.println("X4");
}
System.out.println("X1");
public ClassWithParameters(int var3, int var8) {
this.var3 = var3;
ClassWithParameters.var8 = 7;
System.out.println("X5");
}
static {
System.out.println("X2");
}
int
int
int
int
var1 = 1;
var2;
var3;
var4;
static
static
static
static
static
static
{
}
int
int
int
int
int
int
{
var5 = 5;
var6;
var7;
var8;
var9;
var10;
var2 = 2;
var6 = 6;
System.out.println("X3");
}
var4 = 3;
var9 = 8;
System.out.println("X6");
static {
var10 = 10;
System.out.println("X7");
}
}
public static void main(String[] args) {
System.out.println("X8");
}
Инициализация параметров
91
public class ClassWithParameters {
{
}
static {
var7 = 9;
System.out.println("X4");
}
System.out.println("X1");
public ClassWithParameters(int var3, int var8) {
this.var3 = var3;
ClassWithParameters.var8 = 7;
System.out.println("X5");
}
static {
System.out.println("X2");
}
int
int
int
int
var1 = 1;
var2;
var3;
var4;
static
static
static
static
static
static
{
}
int
int
int
int
int
int
var5 = 5;
var6;
var7;
var8;
var9;
var10;
var2 = 2;
var6 = 6;
System.out.println("X3");
//(2-4-7)-8
{
}
var4 = 3;
var9 = 8;
System.out.println("X6");
static {
var10 = 10;
System.out.println("X7");
}
}
public static void main(String[] args) {
System.out.println("X8");
}
Инициализация параметров
92
public class ClassWithParameters {
{
}
static {
var7 = 9;
System.out.println("X4");
}
System.out.println("X1");
public ClassWithParameters(int var3, int var8) {
this.var3 = var3;
ClassWithParameters.var8 = 7;
System.out.println("X5");
}
static {
System.out.println("X2");
}
int
int
int
int
var1 = 1;
var2;
var3;
var4;
static
static
static
static
static
static
{
}
int
int
int
int
int
int
{
var5 = 5;
var6;
var7;
var8;
var9;
var10;
}
var4 = 3;
var9 = 8;
System.out.println("X6");
static {
var10 = 10;
System.out.println("X7");
}
var2 = 2;
var6 = 6;
System.out.println("X3");
}
public static void main(String[] args) {
System.out.println("X8");
new ClassWithParameters(3, 8);
System.out.println("X9");
}
Инициализация параметров
93
public class ClassWithParameters {
{
}
static {
var7 = 9;
System.out.println("X4");
}
System.out.println("X1");
public ClassWithParameters(int var3, int var8) {
this.var3 = var3;
ClassWithParameters.var8 = 7;
System.out.println("X5");
}
static {
System.out.println("X2");
}
int
int
int
int
var1 = 1;
var2;
var3;
var4;
static
static
static
static
static
static
{
}
int
int
int
int
int
int
{
var5 = 5;
var6;
var7;
var8;
var9;
var10;
}
static {
var10 = 10;
System.out.println("X7");
}
var2 = 2;
var6 = 6;
System.out.println("X3");
}
//(2-4-7)-8-[1-3-6-5]-9
var4 = 3;
var9 = 8;
System.out.println("X6");
public static void main(String[] args) {
System.out.println("X8");
new ClassWithParameters(3, 8);
System.out.println("X9");
}
Инициализация параметров
94
public class ClassWithParameters {
{
}
static {
var7 = 9;
System.out.println("X4");
}
System.out.println("X1");
public ClassWithParameters(int var3, int var8) {
this.var3 = var3;
ClassWithParameters.var8 = 7;
System.out.println("X5");
}
static {
System.out.println("X2");
}
int
int
int
int
var1 = 1;
var2;
var3;
var4;
static
static
static
static
static
static
{
}
int
int
int
int
int
int
{
var5 = 5;
var6;
var7;
var8;
var9;
var10;
}
var4 = 3;
var9 = 8;
System.out.println("X6");
static {
var10 = 10;
System.out.println("X7");
}
var2 = 2;
var6 = 6;
System.out.println("X3");
}
public static void main(String[] args) {
System.out.println("X8");
new ClassWithParameters(3, 8);
System.out.println("X9");
new ClassWithParameters(3, 8);
System.out.println("X10");
}
Инициализация параметров
95
public class ClassWithParameters {
{
}
static {
var7 = 9;
System.out.println("X4");
}
System.out.println("X1");
public ClassWithParameters(int var3, int var8) {
this.var3 = var3;
ClassWithParameters.var8 = 7;
System.out.println("X5");
}
static {
System.out.println("X2");
}
int
int
int
int
var1 = 1;
var2;
var3;
var4;
static
static
static
static
static
static
{
}
int
int
int
int
int
int
{
var5 = 5;
var6;
var7;
var8;
var9;
var10;
}
static {
var10 = 10;
System.out.println("X7");
}
var2 = 2;
var6 = 6;
System.out.println("X3");
//(2-4-7)-8-[1-3-6-5]-9-[1-3-6-5]-10
var4 = 3;
var9 = 8;
System.out.println("X6");
}
public static void main(String[] args) {
System.out.println("X8");
new ClassWithParameters(3, 8);
System.out.println("X9");
new ClassWithParameters(3, 8);
System.out.println("X10");
}
Инициализация параметров
- Инициализация полей
1. инициализация класса
1. сверху вниз — static поля и static блоки инициализации
2. инициализация экземпляра класса
1. сверху вниз — поля и блоки инициализации
2. конструктор
96
Вложенные классы
- Вложенные классы
97
Вложенные классы
- Вложенные классы
- Не статичный класс
98
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
99
Вложенные классы
public class LimitedIntArray1 {
private final int[] data;
public LimitedIntArray1(int size) {
data = new int[size];
}
public LimitedIntArray1(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
100
Вложенные классы
public class LimitedIntArray1 {
private final int[] data;
public LimitedIntArray1(int size) {
data = new int[size];
}
public LimitedIntArray1(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
101
Как обойти элементы?
Вложенные классы
public class LimitedIntArray1 {
102
public class LimitedIntArray1Main1 {
private final int[] data;
public LimitedIntArray1(int size) {
data = new int[size];
}
public LimitedIntArray1(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
}
public static void main(String[] args) {
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
LimitedIntArray1 lia1 = new LimitedIntArray1(data);
for (int i = 0; i < lia1.size(); i++) {
System.out.print(lia1.get(i) + " ");
}
//0 1 2 3 4 5 6 7 8 9
}
Вложенные классы
public class LimitedIntArray1 {
103
public class LimitedIntArray1Main1 {
private final int[] data;
public LimitedIntArray1(int size) {
data = new int[size];
}
public LimitedIntArray1(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
}
public static void main(String[] args) {
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
LimitedIntArray1 lia1 = new LimitedIntArray1(data);
for (int i = 0; i < lia1.size(); i++) {
System.out.print(lia1.get(i) + " ");
}
//0 1 2 3 4 5 6 7 8 9
}
public class LimitedIntArray1Main2 {
public static void main(String[] args) {
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
}
}
LimitedIntArray1 lia2 = new LimitedIntArray1(data);
final int size = lia2.size();
final int halfSize = size / 2;
for (int i = 0; i < halfSize; i++) {
System.out.print(lia2.get(i) + " ");
}
lia2.set(halfSize, -100);
for (int i = halfSize; i < size; i++) {
System.out.print(lia2.get(i) + " ");
}
//0 1 2 3 4 -100 6 7 8 9
Вложенные классы
public class LimitedIntArray1 {
104
Как узнать про изменение коллекции?
private final int[] data;
public LimitedIntArray1(int size) {
data = new int[size];
}
public LimitedIntArray1(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
public class LimitedIntArray1Main2 {
public static void main(String[] args) {
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
}
}
LimitedIntArray1 lia2 = new LimitedIntArray1(data);
final int size = lia2.size();
final int halfSize = size / 2;
for (int i = 0; i < halfSize; i++) {
System.out.print(lia2.get(i) + " ");
}
lia2.set(halfSize, -100);
for (int i = halfSize; i < size; i++) {
System.out.print(lia2.get(i) + " ");
}
//0 1 2 3 4 -100 6 7 8 9
Вложенные классы
public class LimitedIntArray2 implements Iterable<Integer> {
private final int[] data;
private int modCount;
public LimitedIntArray2(int size) {
data = new int[size];
}
public LimitedIntArray2(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
modCount++;
}
@Override
public Iterator<Integer> iterator() {
. . .
}
105
Вложенные классы
public class LimitedIntArray2 implements Iterable<Integer> {
private final int[] data;
private int modCount;
public LimitedIntArray2(int size) {
data = new int[size];
}
public LimitedIntArray2(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
modCount++;
}
@Override
public Iterator<Integer> iterator() {
. . .
}
106
Вложенные классы
107
public class LimitedIntArray2 implements Iterable<Integer> {
private final int[] data;
private int modCount;
private class Iter implements Iterator<Integer> {
int position;
//int modCount = LimitedIntArray2.this.modCount;
int currentModCount = modCount;
public LimitedIntArray2(int size) {
data = new int[size];
}
@Override
public boolean hasNext() {
return position < data.length;
}
public LimitedIntArray2(int[] data) {
this.data = data;
}
public int size() {
return data.length;
}
public int get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
public void set(int index, int value) {
Objects.checkIndex(index, data.length);
data[index] = value;
modCount++;
}
@Override
public Iterator<Integer> iterator() {
. . .
}
}
@Override
public Integer next() {
//if (modCount != LimitedIntArray2.this.modCount)
if (currentModCount != modCount) {
throw new ConcurrentModificationException();
}
if (position >= data.length) {
throw new NoSuchElementException();
}
return data[position++];
}
Вложенные классы
108
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private class Iter implements Iterator<Integer> {
LimitedIntArray2 lia2 = new LimitedIntArray2(data);
int position;
//int modCount = LimitedIntArray2.this.modCount;
int currentModCount = modCount;
@Override
public boolean hasNext() {
return position < data.length;
}
@Override
public Integer next() {
//if (modCount != LimitedIntArray2.this.modCount)
if (currentModCount != modCount) {
throw new ConcurrentModificationException();
}
if (position >= data.length) {
throw new NoSuchElementException();
}
return data[position++];
}
Вложенные классы
109
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private class Iter implements Iterator<Integer> {
LimitedIntArray2 lia2 = new LimitedIntArray2(data);
int position;
//int modCount = LimitedIntArray2.this.modCount;
int currentModCount = modCount;
for (int x : lia2) {
System.out.print(x + " ");
}
//0 1 2 3 4 5 6 7 8 9
@Override
public boolean hasNext() {
return position < data.length;
}
@Override
public Integer next() {
//if (modCount != LimitedIntArray2.this.modCount)
if (currentModCount != modCount) {
throw new ConcurrentModificationException();
}
if (position >= data.length) {
throw new NoSuchElementException();
}
return data[position++];
}
Вложенные классы
110
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private class Iter implements Iterator<Integer> {
LimitedIntArray2 lia2 = new LimitedIntArray2(data);
int position;
//int modCount = LimitedIntArray2.this.modCount;
int currentModCount = modCount;
int id = 0;
for (int x : lia2) {
System.out.print(x + " ");
if (id == 5) {
lia2.set(id, -100);
}
id++;
}
//0 1 2 3 4 5
java.util.ConcurrentModificationException
@Override
public boolean hasNext() {
return position < data.length;
}
@Override
public Integer next() {
//if (modCount != LimitedIntArray2.this.modCount)
if (currentModCount != modCount) {
throw new ConcurrentModificationException();
}
if (position >= data.length) {
throw new NoSuchElementException();
}
return data[position++];
}
Вложенные классы
111
final int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private class Iter implements Iterator<Integer> {
LimitedIntArray2 lia2 = new LimitedIntArray2(data);
int position;
//int modCount = LimitedIntArray2.this.modCount;
int currentModCount = modCount;
int id = 0;
for (int x : lia2) {
System.out.print(x + " ");
if (id == 5) {
lia2.set(id, -100);
}
id++;
}
//0 1 2 3 4 5
java.util.ConcurrentModificationException
Iterator<Integer> iterator = lia2.iterator();
int id = 0;
while (iterator.hasNext()) {
int x = iterator.next();
System.out.print(x + " ");
if (id == 5) {
lia2.set(id, -100);
}
id++;
}
@Override
public boolean hasNext() {
return position < data.length;
}
@Override
public Integer next() {
//if (modCount != LimitedIntArray2.this.modCount)
if (currentModCount != modCount) {
throw new ConcurrentModificationException();
}
if (position >= data.length) {
throw new NoSuchElementException();
}
return data[position++];
}
private void checkForComodification() {
}
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Имеет ссылку на внешний — this
- Имеет доступ к полям и методам внешнего класса
112
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Имеет ссылку на внешний — this
- Имеет доступ к полям и методам внешнего класса
- Видимость ограничена внешним классом
113
Вложенные классы
114
public class InnerClass {
public static void main(String[] args) {
class X {
int x0 = 0;
}
X x = new X();
x.x0 = 123;
System.out.println(x.x0);
for (int i = 0; i < 2; i++) {
final int z = i + 10;
class Y {
//var value should be final or effective final
final int y1 = z;
final int y2;
}
}
}
}
public Y(int y2) {
this.y2 = y2;
}
Y y = new Y(i);
System.out.print(y.y1 + " " + y.y2);
System.out.println();
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Имеет ссылку на внешний — this
- Имеет доступ к полям и методам внешнего класса
- Видимость ограничена внешним классом
- Можно определить в методе или цикле
115
Вложенные классы
ParallelClass1.java
public class ParallelClass1 {
}
class ParallelClass2 {
public static void main(String[] args) {
System.out.println("OK");
}
}
class ParallelClass3 {
}
116
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Имеет ссылку на внешний — this
- Имеет доступ к полям и методам внешнего класса
- Видимость ограничена внешним классом
- Можно определить в методе или цикле
- Вложенный в .java файл
- Параллельно основному классу в том же .java файле
- Основной класс имеет название файла
- Только основной может быть public
117
Вложенные классы
118
ParallelClass1.java
public class ParallelClass1 {
}
}
class ParallelClass2 {
public static void main(String[] args) {
System.out.println("OK");
}
}
class ParallelClass3 {
}
class ParallelClass1 {
class ParallelClass2 {
public static void main(String[] args) {
System.out.println("OK");
}
}
class ParallelClass3 {
}
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Имеет ссылку на внешний — this
- Имеет доступ к полям и методам внешнего класса
- Видимость ограничена внешним классом
- Можно определить в методе или цикле
- Вложенный в .java файл
- Параллельно основному классу в том же .java файле
- Основной класс имеет название файла
- Только основной может быть public
- Но не обязан
119
Вложенные классы
120
ParallelClass1.java
package ru.mail.polis.open.lectures.l4.inner;
class ParallelClass2 {
public static void main(String[] args) {
System.out.println("OK");
}
}
➜ cat ru/mail/polis/open/lectures/l4/inner/ParallelClass1.java
package ru.mail.polis.open.lectures.l4.inner;
class ParallelClass2 {
public static void main(String[] args) {
System.out.println("OK");
}
}
➜ javac ru/mail/polis/open/lectures/l4/inner/ParallelClass1.java
➜ java ru.mail.polis.open.lectures.l4.inner.ParallelClass2
OK
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Имеет ссылку на внешний — this
- Имеет доступ к полям и методам внешнего класса
- Видимость ограничена внешним классом
- Можно определить в методе или цикле
- Вложенный в .java файл
- Параллельно основному классу в том же .java файле
- Основной класс имеет название файла
- Только основной может быть public
- Но не обязан
- Вообще, его может и не быть
121
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Вложенный в .java файл
- Статичный класс
122
Вложенные классы
public class LimitedPointArray {
private static final int DEFAULT_X1 = 10;
private static final int DEFAULT_X2 = 20;
private final Point[] data;
public LimitedPointArray(int size) {
data = new Point[size];
}
public int size() {
return data.length;
}
public Point get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
public void set(int index, Point value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
}
public void set(int index, int x1, int x2) {
Objects.checkIndex(index, data.length);
data[index] = new Point(x1, x2);
}
. . .
123
Вложенные классы
124
public class LimitedPointArray {
private static final int DEFAULT_X1 = 10;
private static final int DEFAULT_X2 = 20;
private final Point[] data;
public LimitedPointArray(int size) {
data = new Point[size];
}
public int size() {
return data.length;
}
public Point get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
}
public static class Point {
int x1;
int x2;
public void set(int index, Point value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
public Point() {
x1 = DEFAULT_X1;
x2 = LimitedPointArray.DEFAULT_X2;
}
public void set(int index, int x1, int x2) {
Objects.checkIndex(index, data.length);
data[index] = new Point(x1, x2);
}
. . .
public Point(int x1, int x2) {
this.x1 = x1;
this.x2 = x2;
}
}
Вложенные классы
public class LimitedPointArray {
125
public class LimitedPointArrayMain {
private static final int DEFAULT_X1 = 10;
private static final int DEFAULT_X2 = 20;
private final Point[] data;
public LimitedPointArray(int size) {
data = new Point[size];
}
}
public static void main(String[] args) {
LimitedPointArray limitedPointArray = new LimitedPointArray(3);
limitedPointArray.set(0, new LimitedPointArray.Point());
limitedPointArray.set(1, new LimitedPointArray.Point(1, 2));
limitedPointArray.set(2, 2, 3);
}
public int size() {
return data.length;
}
public Point get(int index) {
Objects.checkIndex(index, data.length);
return data[index];
}
}
public static class Point {
int x1;
int x2;
public void set(int index, Point value) {
Objects.checkIndex(index, data.length);
data[index] = value;
}
public Point() {
x1 = DEFAULT_X1;
x2 = LimitedPointArray.DEFAULT_X2;
}
public void set(int index, int x1, int x2) {
Objects.checkIndex(index, data.length);
data[index] = new Point(x1, x2);
}
. . .
public Point(int x1, int x2) {
this.x1 = x1;
this.x2 = x2;
}
}
Вложенные классы
- Вложенные классы
- Не статичный класс
- Вложенный внутрь класса
- Вложенный в .java файл
- Статичный класс
- Не имеет ссылки на this внешнего
- Может использовать static переменные и методы
- Можно создать без экземпляра объекта
126
Домашняя
- Домашняя
127
Домашняя
- Вычисление арифметических выражений
128
Домашняя
@FunctionalInterface
public interface Expr {
}
/**
* Вычисляет значение выражение.
*
* Вычисление должно производиться лениво.
*
* Необходимо реализовать все операции, описанные в {@link ExprBuilder}.
*
* @return результат вычисления выражение
*/
int evaluate();
129
Домашняя
@FunctionalInterface
public interface ExprBuilder {
}
/**
* Метод собирающий из входной строки объект являющийся арифметическим выражением.
* <p>
* В выражении может быть:
* умножение - '*'
* деление - '/'
* сложение — '+'
* вычитание — '—'
* унарный минус — '-'
* степень — '^'
* круглые скобки — '(', ')'
* константы
* пробелы — их следует игнорировать
* <p>
* Все вычисления производятся в типе - int.
* Приоритет операций аналогичный математическому.
* <p>
* Примеры:
* "5 + 5" = 10 -> Add(Const(5),Const(5))
* "5 * 2 - 1 + 2" = 11 -> Add( Sub( Mult( Const(5),Const(2) ), Const(1)), Const(2))
*
* @param input — входная строка
* @return арифметическое выражение
* @throws IllegalArgumentException если арифметическое выражение некорректно
*/
Expr build(String input);
130
Домашняя
131
@FunctionalInterface
public interface Expr {
}
/**
* Вычисляет значение выражение.
*
* Вычисление должно производиться лениво.
*
* Необходимо реализовать все операции, описанные в {@link ExprBuilder}.
*
* @return результат вычисления выражение
*/
int evaluate();
public final class Add implements Expr {
public final class Const implements Expr {
private final Expr left;
private final Expr right;
private final int value;
public Add(Expr left, Expr right) {
this.left = left;
this.right = right;
}
public Const(int value) {
this.value = value;
}
}
@Override
public int evaluate() {
return value;
}
}
@Override
public int evaluate() {
return left.evaluate() + right.evaluate();
}
Домашняя
- Вычисление арифметических выражений
- Реализовать все необходимые классы
- Написать к каждому тесты
132
Домашняя
133
public final class Add implements Expr {
public final class Const implements Expr {
private final Expr left;
private final Expr right;
private final int value;
}
public Const(int value) {
this.value = value;
}
public Add(Expr left, Expr right) {
this.left = left;
this.right = right;
}
@Override
public int evaluate() {
return value;
}
@Override
public int evaluate() {
return left.evaluate() + right.evaluate();
}
}
class ConstTest {
class AddTest {
@Test
void test() {
assertEquals(
3,
new Add(
new Const(1),
new Const(2)
).evaluate()
);
}
@Test
void test() {
assertEquals(
5,
new Const(
5
).evaluate()
);
}
}
}
134
Спасибо за внимание!
https://tt.me/mikhailnechaev
https://tt.me/java_open_2019
Домашняя работа #3
135
/**
* Метод проверяющий скобочную последовательность на правильность.
* <p>
* Пустая строка
* — правильная скобочная последовательность.
* Правильная скобочная последовательность, взятая в скобки одного типа
* — правильная скобочная последовательность.
* Правильная скобочная последовательность,
* к которой слева или справа приписана правильная скобочная последовательность
* — правильная скобочная последовательность.
* <p>
* Скобки бывают:
* 1. Круглые '(', ')'
* 2. Квадратные '[', ']'
* 3. Фигурные '{', '}'
*
* @param sequence — входная строка
* @return {@code true} — если скобочная последовательность корректна и {@code false} иначе
* @throws IllegalArgumentException если в строке содержатся символы, не являющиеся
скобками
*/
Домашняя работа #3
• В результирующим PR нужно предоставить
• Код решения
• Весь код внутри CorrectBracketSequencePredicate
• Сигнатуры класса, конструктора и метода следует
оставить неизменными
• Комментарии оставить неизменными
• Можно добавлять дополнительные методы
• Тесты
• Внутри package ru.mail.polis.open.task3
• Видны public / protected / <package_private> методы
136
Автор
tekhnostrim
Документ
Категория
Без категории
Просмотров
88
Размер файла
1 903 Кб
Теги
class, методы, вложенные классы, приведение типов, инициализация параметров
1/--страниц
Пожаловаться на содержимое документа