Почему мы имеем право при переопределении метода clone() писать его сигнатуру БЕЗ
"throws CloneNotSupportedException"
ведь в сигнатуре класса Object
protected native Object clone() throws CloneNotSupportedException
есть проброс исключений Для примера возьмем класс ArrayDeque и посмотрим на реализацию этого метода в нем. Вы можете ответить - в переопределенном методе мы ловим исключения - НУ И ЧТО, есть же правила переопределения метода - СИГНАТУРА ДОЛЖНА СОВПАДАТЬ,за исключением возвращаемого типа(он может расшириться: protected->public) . А здесь мы берем и выкидываем "throws CloneNotSupportedException" из сигнатуры, почему?
public ArrayDeque<E> clone() {
        try {
            @SuppressWarnings("unchecked")
            ArrayDeque<E> result = (ArrayDeque<E>) super.clone();
            result.elements = Arrays.copyOf(elements, elements.length);
            return result;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
А если мы возьмем еще какойто класс и отнаследуемся от ArrayDeque, то там мы тоже теряем эту сигнатуру
public static class C extends ArrayDeque {
        public ArrayDeque clone()  {
            return super.clone();
        }
    }