Я немного запутался в синтаксисе приведения типов и создания объектов. Вот у меня есть код
class OverridingTest{
public static void main(String [] args){
Dog dog = new Hound();
((Hound)dog).sniff();
}
}
class Dog{
public void bark(){
System.out.println("woof ");
}
}
class Hound extends Dog{
public void sniff(){
System.out.println("sniff ");
}
public void bark(){
System.out.println("bowl");
}
}
У меня есть некоторые сведения о синтаксисе и кастинге. Однако, когда я попытался не использовать объект «собака», он отправляет ошибку. Я немного смущен тем, почему компилятор это делает.
Я прочитал несколько ссылок об этом и увидел синтаксис создания экземпляров объектов в контексте приведения. Он сказал, что в этой строке кода:
Dog dog = new Hound();
«Собака» в начале строки определяет «Тип» объектов. В частности, он определяет операции, которые может выполнять объект, а «собака», которая является подклассом класса «собака», является «классом» и определяет реализацию методов, доступных для экземпляра объекта.
Теперь это та часть, где я начал путаться. Разве не так, как объект «собака», был создан уже со ссылкой на класс «гончая»? Это означает, что объект «собака» имеет реализацию класса Hound и, следовательно, может получить доступ к его методам? Зачем мне нужно добавлять оператор приведения типов при доступе к его методам? Как это?
((Hound)dog).sniff();
Кроме того, у меня есть еще один вопрос по этому поводу, который является отдельным вопросом, но ссылается на тот же код. Я попытался создать экземпляр объекта «собака» со ссылкой на класс класса «Собака», как это.
Dog dog = new Dog();
И затем я помещаю его в подкласс новой строки, где
Hound newdog = (Hound) dog;
Это соответствует синтаксису приведения типов и прекрасно компилируется. Однако я получаю ошибку времени выполнения. Разве это не соответствует методам литья? Если нет, то как бы я сделал это по-другому?