Нужна помощь для примера отправки динамического метода

#java #inheritance

#java #наследование

Вопрос:

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

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

1) Что означает получение ссылки типа A в приведенной ниже программе? (Эта концепция реализована в строке A r; в основном методе)
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();
}
}
 

Комментарии:

1. В чем ваш вопрос? Можете ли вы объяснить, что происходит, когда вы запускаете программу? Я не вижу никакой динамической отправки, все ваши вызовы будут вызываться виртуально.

2. Эта программа была описана в книге, которую я упомянул в вопросе. Результат вышеупомянутой программы таков: Im в ClassA, Im в ClassB и Im в ClassC

3. Это то, что вы ожидаете. Я все еще не понял, в чем заключается ваш вопрос.

4. Я использую основной метод, есть строка -> A r; -> Рядом с этой строкой написан комментарий -> получить ссылку типа A. Что это значит?

5. Я не вижу комментария, однако ссылка — это просто способ поиска объекта. Значение по умолчанию null — т.Е. Нет объекта.

Ответ №1:

Это способ преодолеть проблему переопределения метода. Если вы хотите избавиться от переполнения метода в какой-то момент во время вашей разработки, вы можете использовать этот способ 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(); 
    } 
}
 

Ответ №2:

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

Комментарии:

1. Извините, снова задаю вопрос новичка. Что технически означает ссылка на переменную класса A? Означает ли это ссылку на адрес?

2. yeah…it просто хочу показать концепцию переопределения … как 1. ‘r = a; r.callme();’ означает, что при вызове метода класса с его объектом выполняется метод callme() ‘A’ 2. ‘r = b;’ после этого ‘r.callme()’ затем он запускает метод ‘class B’ ‘callme()’, потому что B переопределяет метод ‘A’. 3. Пусть будет написано ‘r = c; r.callme()’, тогда будет запущен метод класса ‘C’ .

3. Извините за мое невежество, я вас не понимаю.

4. Ссылочная переменная в Java содержит адрес или ссылку на адрес (аналогично переменным-указателям в C ). Однако Java не позволяет произвольно (случайным образом) редактировать или изменять этот адрес каким-либо образом. Это относится и к переменным-указателям в C . Итак, ссылочные переменные аналогичны переменным-указателям в C . Они предоставляют метод, с помощью которого можно получить доступ к другой переменной или адресу памяти, который имеет переменную, и позволяют изменять данные в пределах вышеупомянутого адреса памяти. Ссылочная переменная обеспечивает прямой доступ к этому адресу памяти. И он хранится в стеке.