04.09
This commit is contained in:
+59
@@ -0,0 +1,59 @@
|
||||
- Возможность вызвать метод определяется по типу ссылки
|
||||
- Ссылку нельзя привести к произвольному типу
|
||||
- Сслыку можно привести к более общему типу
|
||||
- Ссылку можно привести к реальному типу объекта
|
||||
- Оператор `instanceof` проверяет тип объекта
|
||||
## Оператор `instanceof`
|
||||
```Java
|
||||
// ColorSquare extends Square
|
||||
ColorSquare s = new ColorSquare();
|
||||
s instanceof ColorSquare // true
|
||||
s instanceof Square // true
|
||||
s instanceof String // false
|
||||
```
|
||||
## Upcasting
|
||||
Приведение к суперклассу
|
||||
```Java
|
||||
Square x = s;
|
||||
x.area(); // OK
|
||||
x.getColor(); // Ошибка - нет такого метода
|
||||
```
|
||||
## Downcasting
|
||||
Приведение к реальному типу
|
||||
|
||||
Если изначально был таким
|
||||
```Java
|
||||
ColorSquare s = new ColorSquare();
|
||||
Square x = s;
|
||||
x.area(); // OK
|
||||
|
||||
ColorSquare y = (ColorSquare) x;
|
||||
y.getColor(); // OK
|
||||
```
|
||||
А вот если нет
|
||||
```Java
|
||||
Square s = new ColorSquare();
|
||||
Square x = s;
|
||||
x.area(); // OK
|
||||
|
||||
ColorSquare y = (ColorSquare) x;
|
||||
// ClassCastException
|
||||
```
|
||||
## Pattern Matching
|
||||
Перед даункастом лучше проверить тип через `instanceof`
|
||||
```Java
|
||||
...
|
||||
if (x instanceof ColorSquare) {
|
||||
ColorSquare y = (ColorSquare) x;
|
||||
y.getColor(); // OK
|
||||
}
|
||||
```
|
||||
Либо более короткий синтаксис
|
||||
```Java
|
||||
...
|
||||
if (x instanceof Colorsquare y) {
|
||||
y.getColor(); // OK
|
||||
}
|
||||
```
|
||||
|
||||
То есть после апкаста джава не забывает какой тип был изначально
|
||||
Reference in New Issue
Block a user