Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Полиморфизм / 16 сообщений из 16, страница 1 из 1
15.03.2006, 16:38
    #33603066
JGuest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Добрый день.

Возник вопрос по поводу полиморфизма: что это и в чем "сила".
Подскажите, прав ли я.

Предположим, есть базовый класс A:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public   class  A {	
	
	A() {
		System.out.println("Class A Constructor");
		showMsg();
	}
	
	 void  showMsg() {
		System.out.println("ShowMsg Class A");
	}
}

Есть класс-наследник B:

Код: plaintext
1.
2.
3.
4.
5.
 public   class  B  extends  A {
	
	 void  showMsg() {
		System.out.println("ShowMsg Class B");
	}
}

В главном классе MainClass я создаю объекты классов A и B:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 public   class  MainClass {

	 public   static   void  main(String[] args) {
		A a =  new  A();

		B b =  new  B();
	}
}

Так вот при создании ссылки на объект класса B и будет работать полиморфизм, т.е. выполнится конструктор класса A, а потом метод из класса B (еще это в литературе называют поздним связыванием).

Прав ли я ?
...
Рейтинг: 0 / 0
15.03.2006, 18:52
    #33603453
далай
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
при new B() конструктор A() не выполнится

фишка в том, что вы можете написать

A a = new B()

а потом вызывать методы как класса A так и B при помощикаста

((B)a).showMsg();
...
Рейтинг: 0 / 0
15.03.2006, 19:02
    #33603473
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
далай

> а потом вызывать методы как класса A так и B при помощикаста

> ((B)a).showMsg();

не получится вызвать методы класса A. автоматически выполнится метод
класса B


-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
15.03.2006, 19:09
    #33603490
Sherst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Полиморфизм это возможность использовать одноименные методы с одинаковым или различным набором параметров в группе классов связанных отношением наследования.
В свою очередь, понятие полиморфизма опирается на 2 других понятия :

- совместное использование (одноименные методы с различным набором параметров)
Например :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 class  Base {

     void  f( int  k) {
      . . .
    }
    . . .
}

 class  Derived  extends  Base {

     void  f(String s,  int  k) {
      . . .
    }
    . . .
}

- переопределение (одноименные методы с одинаковым набором параметров)

Например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 class  A {
    int  f( int  a) {
       return  a;
   }
   . . .
}

 class  B  extends  A {
    int  f( int  s) {
        return  s;
    }
   . . .
}

...............
B b =  new  B();
A a = b;         // здесь происходит формальное преобразование типа: B => A
 int  c = a.f( 10 ); // ??? какой из f(...) будет вызван ??? оказывается класса B



Ссылка а формально имеет тип A, но ссылается на объект класса B.
В Java выполняется вызов метода данного объекта с учетом того, что объект может быть не того же класса, что и ссылка, указывающая на него. Т.е. выполняется вызов метода того класса, к которому реально относится объект.

Это — динамический полиморфизм методов. Он называется поздним связыванием (dynamic binding, late binding, run-time binding).
...
Рейтинг: 0 / 0
15.03.2006, 19:29
    #33603533
K1RUHA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
далайпри new B() конструктор A() не выполнится

фишка в том, что вы можете написать

A a = new B()

а потом вызывать методы как класса A так и B при помощикаста

((B)a).showMsg();

Интересно а как будут инициализироваться данные базового класса, если не конструктором по умолчанию%
...
Рейтинг: 0 / 0
15.03.2006, 19:42
    #33603551
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
JGuestТак вот при создании ссылки на объект класса B и будет работать полиморфизм, т.е. выполнится конструктор класса A, а потом метод из класса B (еще это в литературе называют поздним связыванием).
Потенциально перегружаемые методы из конструктора вызывать нельзя. Конкретно этот код работает случайно - он не пользуется полями класса.
...
Рейтинг: 0 / 0
16.03.2006, 09:12
    #33604114
далай
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
при new B() конструктор A() не выполнится

фишка в том, что вы можете написать

A a = new B()

а потом вызывать методы как класса A так и B при помощикаста

((B)a).showMsg();
...
Рейтинг: 0 / 0
16.03.2006, 09:14
    #33604118
далай
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
блин. нажал рефрешь, а оно запостилось еще раз...
...
Рейтинг: 0 / 0
16.03.2006, 09:40
    #33604179
далай
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
>не получится вызвать методы класса A. автоматически выполнится метод класса B

точно. я фигню сказал
...
Рейтинг: 0 / 0
16.03.2006, 12:29
    #33604898
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
далай>не получится вызвать методы класса A. автоматически выполнится метод класса B

точно. я фигню сказал

кстати, утверждение неверно для статических методов.
...
Рейтинг: 0 / 0
16.03.2006, 14:31
    #33605475
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Deady далай>не получится вызвать методы класса A. автоматически выполнится метод класса B

точно. я фигню сказал

кстати, утверждение неверно для статических методов.

фигня заключается в том, что статические методы не наследуются?
...
Рейтинг: 0 / 0
16.03.2006, 14:47
    #33605555
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
NotGonnaGetUs
фигня заключается в том, что статические методы не наследуются?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 class  Dog {
     public   static   void  bark() {
        System.out.print("woof ");
    }
}

 class  Basenji  extends  Dog {
     public   static   void  bark() { }
}



 public   class  Bark {
     public   static   void  main(String args[]) {
        Dog woofer =  new  Dog();
        Dog nipper =  new  Basenji();
        woofer.bark();
        nipper.bark();
    }
}

The title of this puzzle gives a big hint. The problem is that bark is a
static method, and there is no dynamic dispatch on static methods [JLS 15.12.4.4].
When a program calls a static method, the method to be invoked is selected at compile
time, based on the compile-time type of the qualifier, which is the name we
give to the part of the method invocation expression to the left of the dot.
In this case, the qualifiers of the two method invocations are the variables
woofer and nipper, both of which are declared to be of type Dog. Because they
have the same compile-time type, the compiler causes the same method to be invoked: Dog.bark.
This explains why the program prints woof woof. It doesn't matter that the runtime type of nipper is Basenji;
only its compile-time type is considered.

из книги Java? Puzzlers: Traps, Pitfalls, and Corner Cases, puzzle #48

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
16.03.2006, 14:48
    #33605559
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
SherstПолиморфизм это возможность использовать одноименные методы с одинаковым или различным набором параметров в группе классов связанных отношением наследования.
В свою очередь, понятие полиморфизма опирается на 2 других понятия :

- совместное использование (одноименные методы с различным набором параметров)

- переопределение (одноименные методы с одинаковым набором параметров)



Пункт про "совместное использование" к полиморфизму не имеет никакого отношения. Это просто сахар, позволяющий тратить меньше времени на выдумываение имён для методов (далеко не факт, что это хорошо).

Полиморфизм совместно со статическим связыванием - это нонсенс (или С++), т.к. является просто способом разрешения конфликта имён возникающего при наследовании.

Собственно, полиморфизм - это возможность изменить реализацию метода из родительского класса. Очевидно, что выбор реализации полиморфного метода должен осуществляться на основе "динамического" или "реального" типа объекта, что никак не вяжется ни со статическим связыванием, ни с возможностью иметь в классе методы с одниковыми названиями.
...
Рейтинг: 0 / 0
16.03.2006, 14:52
    #33605574
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Deady NotGonnaGetUs
фигня заключается в том, что статические методы не наследуются?


из книги Java? Puzzlers: Traps, Pitfalls, and Corner Cases, puzzle #48



Предлагаешь мне повторить вопрос? :)

Статические методы не наследуются.

Согласно терминологии JSL они "скрываются" в классах наследниках.
Для разрешения конфликта имён, возникающего из-за существования двух методов с одинаковой сигнатурой в классе используется тип переменной.

При чём тут полиморфизм?
...
Рейтинг: 0 / 0
16.03.2006, 16:37
    #33605972
далай
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
JGuest спрашивал, в чем сила, братья?

поэтому надо объяснять понятно, на примерах, так чтобы даже я понял.

к примеру:

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

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

интерфейс (набор публичных методов) у всех наследников одинаковый, а делают они все разное. получаются драйвера разных баз данных.

и мы можем в нашей программе делать Class.forName(названиеДрайвераИзКонфига), подставляя в конфиге разные драйвера для разных серверов баз данных!

вот это сила.
...
Рейтинг: 0 / 0
16.03.2006, 17:09
    #33606091
BlackWall
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
GoF
Шаблон Мост
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Полиморфизм / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]