#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 . Они предоставляют метод, с помощью которого можно получить доступ к другой переменной или адресу памяти, который имеет переменную, и позволяют изменять данные в пределах вышеупомянутого адреса памяти. Ссылочная переменная обеспечивает прямой доступ к этому адресу памяти. И он хранится в стеке.