Dynami c метод отправки и ошибка полиморфизма во время выполнения - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь понять метод динамического c отправки.

class A {
int i=10;
void callme() {
    System.out.println("Inside A's callme method");
} }
class B extends A {
int j=20;
    void callme() {
        System.out.println("Inside B's callme method");
} }
class C extends A {
int k=30;
void callme() {
    System.out.println("Inside C's callme method");
} }
class  Over_riding_loading{
    public static void main(String args[]) {
        A a = new A(); 
        B b = new B(); 
        C c = new C(); 
        A r; 
        B r; //error when i am using this instead of A r;
        C r; //error when i am using this instead of Ar and B r;
        r = a;

        r.callme();
        System.out.println(r.i);//prints 10
        r = b; 
        r.callme(); 
        System.out.println(r.j);//j cannot be resolved or is not a field--what does this mean?
        r = c; 
        r.callme();
        System.out.println(r.k);//k cannot be resolved or is not a field
} }

Почему отображаются ошибки? Почему я не могу создать переменную r типа B или C и вызвать метод callme ()?

отредактировано: чтобы прояснить некоторые моменты, я не пытаюсь использовать одно и то же имя переменной, я пытаюсь сказать это вместо A r; я пытаюсь использовать B r и сохранить остальную часть кода такой же.

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

вы не можете иметь одно и то же имя переменной для разных типов (в одной и той же области видимости)

изменить ваш основной метод как

   public static void main(String args[]) {
    A a = new A();
    B b = new B();
    C c = new C();
    A r;
    //you cannot have same variable name for different types (in same scope)
    //B r; // error
    //C r; // error
    r = a;

    r.callme();
    System.out.println(r.i);// prints 10
    r = b;
    r.callme();

    //here you're getting error because object is available at runtime, what you are getting is a compile time error
    System.out.println(r.j);// can be resolved by casting it as System.out.println(((B)r).j)
    r = c;
    r.callme();
    // here you're getting error because object is available at runtime, what you are getting is a compile time error
    System.out.println(r.k);// can be resolved by casting it as System.out.println(((C)r).k);
}

Надеюсь, это поможет !!

0 голосов
/ 29 апреля 2020

B р; // ошибка C r; // ошибка

Вышеуказанные ошибки появляются, потому что вы пытаетесь использовать одно и то же имя переменной r с разными типами классов A, B и C. Поскольку A использовался первым, он регистрируется во время компиляции, и любая последующая попытка изменить тип variable r приводит к ошибке времени компиляции.

System.out.println ( т); System.out.println (rk);

Эти ошибки возникают во время компиляции, поскольку во время компиляции поиск variable j и variable k выполняется в class A. Это происходит потому, что ваш variable r относится к типу A. В случае, если вы хотите получить доступ к variable j и variable k, пожалуйста, приведите variable r к class B & class C соответственно.

Надежда это помогает!

0 голосов
/ 29 апреля 2020

Во время выполнения это зависит от типа объекта, на который делается ссылка (не от типа ссылочной переменной), который определяет, какая версия переопределенного метода будет выполняться.

Ссылочная переменная суперкласса может ссылаться на объект подкласса. Это также известно как апкастинг. Java использует этот факт для разрешения вызовов переопределенных методов во время выполнения. Но вы не можете сделать наоборот.

Объявите B r1 и C r2. Вы указываете одно и то же имя переменной для всех трех классов. Поэтому, когда вы вызываете r.j, это дает ошибку, поскольку j является атрибутом объекта B.

То же самое объяснение для r.k case тоже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...