2015-02-01 9 views
2

У меня есть 2 класса, один из которых расширяет второй и переопределяет некоторые из методов родителя. Когда я звоню fs.m(ff), я получил странный результат, и я не могу понять, почему это происходит. тип First fs не должен иметь доступ к классу Second methods, даже если мы назначили для них новый Second object, если только мы не набросим его таким образом - (Second) fs.m(ff). Может ли кто-нибудь объяснить, почему этот код генерирует вывод «override»?Переопределение методов и странное поведение

public class Main { 

    public static void main(String[] args) { 
     First ff = new First(); 
     First fs = new Second(); 
     Second ss = new Second(); 

     System.out.println(fs.m(ff)); 
    } 
} 


public class First { 
    public String m(First x){ 
     return "default"; 
    } 

    public String m(First x, First y){ 
     return "default"; 
    } 
} 

public class Second extends First{ 
    public String m(Second x){ 
     return "overload"; 
    } 

    public String m(First x){ 
     return "override"; 
    } 

    public String m(First x, Second y){ 
     return "???"; 
    } 
} 

ответ

3

Метод вызывается для fs.m(ff) определяется типом во время выполнения fs. Этот тип времени выполнения - Second, и поскольку Second переопределяет метод public String m(First x), этот метод выполняется.

fs имеет доступ сделать методы, объявленные в классе First, так как он имеет тип First, но во время выполнения, фактические методы, которые получают выполняются в зависимости от того, эти методы переопределены типа во время выполнения экземпляра, назначенного fs, который является Second.

+0

Ах, поэтому он просто ведет себя по-разному во время выполнения против времени компиляции, во время выполнения он проверяет возможность, а во время компиляции он никогда не позволяет это (по праву тоже хех) – user3885166

0

Fs фактически указывает второй объект (fs - ссылка на объект типа Second). Итак, когда вы вызываете fs.m (ff), он фактически вызывает объект во втором из-за динамической привязки (переопределения).

Смежные вопросы