i) законно, ii) нет.Это очень легко увидеть, если вы используете метафору, скажем, класс C - это Animal, а класс D - это Dog, метод m () - это makeNoise.Теперь допустимо иметь переменную класса Animal и присвоить ей Dog (потому что собака «является» животным), но не разрешено создавать экземпляр Animal и присваивать его Dog, поскольку Dog более специфичен, чем Animal (мынельзя сказать, что животное "является" собакой).
Теперь о методе: метод всегда вызывается по типу времени выполнения, а не по типу переменной (все вызовы методов являются так называемыми виртуальными в Java)поэтому в случае i) он вызывает метод m () класса D, а не класса C.