Что будет выведено в результате выполнения этого кода?
class A {
public void print() throws Exception {
throw new Exception();
}
}
class B extends A {
public void print() {
System.out.println("B");
}
}
public class Main {
public static final void main(String[] args) {
B b = new B();
b.print();
}
}
1. B
2. Ничего
3. Ошибка компиляции
4. Exception
Ответ:
Переопределяющий метод не должен бросать новое или более широкое по классу исключение. Не бросать его вообще он может. Так что код скомпилируется и выведет B.
Исключения и переопределение метода — 2
Что будет выведено в результате выполнения этого кода?
class A {
public void print() throws Exception {
throw new Exception();
}
}
class B extends A {
public void print() {
System.out.println("B");
}
}
public class Main {
public static final void main(String[] args) {
A a = new B();
a.print();
}
}
1. B
2. Ничего
3. Ошибка компиляции
4. Exception
Ответ:
3. Ошибка компиляции.
Так как мы в классе A объявлено исключение, а в main(...) мы его не обрабатываем. Тип возвращаемого значения (который может быть не таким, как в суперклассе, ведь есть covariant return) и выбрасываемые исключения проверяются компилятором по типу ссылки.
Источник: http://habrahabr.ru/blogs/java/131198/
Этот комментарий был удален автором.
ОтветитьУдалить