У меня небольшая проблема с пониманием того, как объекты выбирают, какие методы использовать при наследовании - PullRequest
0 голосов
/ 06 мая 2019

Делая домашнее задание и обнаружив небольшую проблему, я не могу понять. В основном, вторая строка C и D - это Af (double = ...), и я не понимаю, почему они это сделалине использовать функции из C и D кто-нибудь может объяснить, как это работает?

class A {
    void f(double x ) { 
        System.out.print ("A.f(double=" + x + ") "); 
    }
}
class B extends A {}
class C extends A {
    void f(long q ) {
        System.out.print ("C.f(long=" + q + ") ");
    }
}
class D extends C {
    void f(int n) { 
         System.out.print ("D.f(int=" + n + ") "); 
    }
}
class E extends B {}
class F extends C { 
    void f(float x ) { 
        System.out.print ("F.f(float=" + x + ") ");
     }
    void f(int n ) {
        System.out.print("F.f(int=" + n + ") "); 
    }
}
public class PolySur {
    public static void main (String args [ ]) {
        byte bb=1 ; short p =2; int n=3; 
        long q=4; float x=5.f; double y=6;
        System.out.println ("** A **");
        A a = new A() ; 
        a.f(bb) ; 
        a.f(x); 
        System.out.println();
        System.out.println ("** B **");
        B b = new B( ) ; b.f(bb) ; b.f(x); 
        System.out.println();
        a = b;
        a.f(bb) ; 
        a.f(x); 
        System.out.println();
        System.out.println ("** C **");
        C c = new C( ) ; c.f(bb) ; c.f(q); 
        c.f(x); 
        System.out.println();
        a = c; 
        a.f(bb) ; 
        a.f(q); 
        a.f(x); 
        System.out.println();
        System.out.println ("** D **");
        D d = new D(); 
        d.f(bb) ;
        d.f(q); 
        d.f(y);
        System.out.println();
        a = c; 
        a.f(bb) ;
         a.f(q); 
         a.f(y); 
        System.out.println();
        System.out.println ("** F **");
        F f = new F();
        f.f(bb) ;
        f.f(n); 
        f.f(x); 
        f.f(y); 
        f.f(p); 
        System.out.println();
        a = f; 
        a.f(bb) ; 
        a.f(n);
        a.f(q); 
        a.f(x); 
        a.f(y); 
        System.out.println();
        c = f; 
        c.f(bb) ; 
        c.f(n); 
        c.f(x); 
        c.f(y); 
        System.out.println();
}

1 Ответ

0 голосов
/ 06 мая 2019

a.f (вызывает метод внутри A, потому что ссылочный тип объекта - A. Если вы хотите вызвать метод C с объектом A, вы должны объявить его следующим образом:

A a = new C();
a.f(0);

Обратите внимание: вы можете вызывать таким образом только переопределенные методы A внутри C, поэтому метод f () из C должен иметь одинаковую сигнатуру метода A. В вашем случае сигнатура отличается из-за тип ввода (длинный вместо двойного). Как это:

class A {
    void f(double x ) { 
        System.out.print ("A.f(double=" + x + ") "); 
    }
}
class C extends A {
    void f(double q ) {
        System.out.print ("C.f(long=" + q + ") ");
    }
}
public class PolySur {
    public static void main (String args [ ]) {
        double x = 0;
        A a = new C();
        a.f(x);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...