Нужна помощь для примера отправки динамического метода - PullRequest
1 голос
/ 26 октября 2011

Мне нужна помощь с этим примером программы Java. Этот пример из книги Ява: седьмое издание Герберта Шильдта.

У меня мало сомнений относительно этой программы, а также сомнений по поводу текста (объяснения этой темы), написанного в этой книге. Эта программа написана в разделе Наследование -> Переопределение метода. Здесь A - суперкласс B, а B - суперкласс C. В этой программе callme () - это метод, написанный в трех классах, где каждый callme () переопределяет другой метод callme ().

1) Что означает указание типа А в приведенной ниже программе? (Эта концепция реализована в строке A r; в методе Main)
2) Что такое соглашение о пространстве имен?
3) Что в этой программе означает «r относится к объекту A»? (Эта концепция реализована в строках r.callme (); записана в основном методе.)

class A
{
void callme()
{
System.out.println("Im in the class A");
}
}

class B extends A
{
void callme()
{
System.out.println("Im in the class B");
}
}

class C extends B
{
void callme()
{
System.out.println("Im in the class C");
}
}

public class Dispatch 
{
public static void main(String args[])
{
A a = new A();
B b = new B();
C c = new C();
A r;

r = a;
r.callme();
r = b;
r.callme();
r = c;
r.callme();
}
}

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Это способ преодоления проблемы перегрузки метода. Если вы хотите избавиться от переопределенного метода во время разработки, вы можете использовать этот способ DMD.

Ссылаясь на ваш пример с комментариями:

class A //Super class A
{
    void callme()   // method callme() that'll be overwritten next in subclasses
    {
        System.out.println("Im in the class A"); 
    }
}  
class B extends A   //Subclass B  inherited from A
{            
    void callme()   //method callme() of Super class A is over-hided here
    {
        System.out.println("Im in the class B"); 
    } 
}  
class C extends B            //Subclass C, inherited from B
{
    void callme()    // this time B subclass method callme() is over-hided
    {
        System.out.println("Im in the class C"); 
    }
}  

//Now suppose, during you development phase at some time, you don't want to use over-ridden methods, here is DMD to help you out at run time.

public class Dispatch
{ 
    public static void main(String args[])
    { 
        A a = new A(); 
        B b = new B(); 
        C c = new C(); 
        A r;
        // r is a reference to class A
        // this reference should be assigned to each type of object and called at
        // run time without compiling.
        r = a; 
        r.callme(); 
        r = b; r.callme(); 
        r = c; r.callme(); 
    } 
}
0 голосов
/ 26 октября 2011

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

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