powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Полиморфизм
16 сообщений из 16, страница 1 из 1
Полиморфизм
    #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
Полиморфизм
    #33603453
далай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при new B() конструктор A() не выполнится

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

A a = new B()

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

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

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

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

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


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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Полиморфизм
    #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
Полиморфизм
    #33603533
K1RUHA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
далайпри new B() конструктор A() не выполнится

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

A a = new B()

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

((B)a).showMsg();

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

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

A a = new B()

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

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

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

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

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

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

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

фигня заключается в том, что статические методы не наследуются?
...
Рейтинг: 0 / 0
Полиморфизм
    #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
Полиморфизм
    #33605559
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SherstПолиморфизм это возможность использовать одноименные методы с одинаковым или различным набором параметров в группе классов связанных отношением наследования.
В свою очередь, понятие полиморфизма опирается на 2 других понятия :

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

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



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

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

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


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



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

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

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

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

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

к примеру:

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

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

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

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

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


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