малко помощ?
15 отговора
447 прегледа
малко помощ?
Може ли малко помощ? Как да разбирам това? Какви преимущества има?
Kotka е superclass на Persijka:
Kotka kot = new Persijka();
Po kakvo gornoto serazli4ava ot:
Persijka kot = new Persijka();
Blagodarjq predvaritelno.
Kotka е superclass на Persijka:
Kotka kot = new Persijka();
Po kakvo gornoto serazli4ava ot:
Persijka kot = new Persijka();
Blagodarjq predvaritelno.
Re: малко помощ?
забив:)
ами разликата е че при едното разглеждаш обекта като Котка, т.е. гледаш всички общи черти на котките. Когато го разглеждаш като Персийка, тогава към общите черти на котката имаш достъп и до чертите на Персийката.
Може би по-ясно ще бъде така:
Person you = new Employee()
означава че ти си служител, но в момента ни интересуваш единствено като човек.
Надявам се да съм бил полезен, въпреки че едва ли съм направил перфектното обяснение.
ами разликата е че при едното разглеждаш обекта като Котка, т.е. гледаш всички общи черти на котките. Когато го разглеждаш като Персийка, тогава към общите черти на котката имаш достъп и до чертите на Персийката.
Може би по-ясно ще бъде така:
Person you = new Employee()
означава че ти си служител, но в момента ни интересуваш единствено като човек.
Надявам се да съм бил полезен, въпреки че едва ли съм направил перфектното обяснение.
Re: малко помощ?
Искаш да кажеш, че при
Kotka kот = new Persijka();
mакар че Обекта е тип Персийка, мога да разглеждам само methodite и променливите на класата Котка т.е. не мога да използвам специализираните methodi и променливи на класата Персийка, макар че тях ги има?
Kotka kот = new Persijka();
mакар че Обекта е тип Персийка, мога да разглеждам само methodite и променливите на класата Котка т.е. не мога да използвам специализираните methodi и променливи на класата Персийка, макар че тях ги има?
Re: малко помощ?
Според мен Дрмр само те обърка.
Няма никакво практическо значение дали отляво ще бъде котка или Персийка. Евентуално би си спестил някой каст който иначе би бил експлицитен, но нищо повече.
Няма никакво практическо значение дали отляво ще бъде котка или Персийка. Евентуално би си спестил някой каст който иначе би бил експлицитен, но нищо повече.
Re: малко помощ?
Разликата е и в тъй наречените early binding и late binding. Едното се прави от компилатора, а другото от ВМ. Доколкото се сещам двете имат някои разлики обаче:
1. Ако използваш "Persijka kot = new Persijka();" това може да ти спести по-нататък в програмата някой down casting, който най-вероятно компилатора ще иска да направиш. Що се отнася до upper casting-a - ой си се прави автоматично.
2. Ако използваш "Котка" при декларацията, и и двата класа имат методи с еднакъв подпис, то май ще бъде извикан този от КОТКА а не този от ПЕРСИИСКА, въпреки че реално обекта ти е "ПЕРСИЙСКА".
Мисля че това са основните разлики.
Надявам се, че бях полезен :-)
1. Ако използваш "Persijka kot = new Persijka();" това може да ти спести по-нататък в програмата някой down casting, който най-вероятно компилатора ще иска да направиш. Що се отнася до upper casting-a - ой си се прави автоматично.
2. Ако използваш "Котка" при декларацията, и и двата класа имат методи с еднакъв подпис, то май ще бъде извикан този от КОТКА а не този от ПЕРСИИСКА, въпреки че реално обекта ти е "ПЕРСИЙСКА".
Мисля че това са основните разлики.
Надявам се, че бях полезен :-)
Re: малко помощ?
В отговор на:
2. Ако използваш "Котка" при декларацията, и и двата класа имат методи с еднакъв подпис, то май ще бъде извикан този от КОТКА а не този от ПЕРСИИСКА, въпреки че реално обекта ти е "ПЕРСИЙСКА".
Я пак помисли, че вадя бележника и почвам да пиша 2-ки.
Re: малко помощ?
Не бързай да пишеш двойки.
Пичът не го обясни съвсем правилно, но е прав. При overload-нати методи се гледа типът на референцията, не на самия обект.
Пример:
class A {}
class B extends A {}
void abc(A a) {...}
void abc(B b) {...}
A obj = new B();
abc(obj); // Ще се изпълни abc(A)
Пичът не го обясни съвсем правилно, но е прав. При overload-нати методи се гледа типът на референцията, не на самия обект.
Пример:
class A {}
class B extends A {}
void abc(A a) {...}
void abc(B b) {...}
A obj = new B();
abc(obj); // Ще се изпълни abc(A)
Re: малко помощ?
А дали пича е имал предвид overload на функции или оverride. Защото методи с еднакви signature са overriden, а не overloaded. Таке че ти си прав, но не и в този случай.
Re: малко помощ?
Мда, прав си. Kато прочетох по-внимателно какво е написал EroS в точка 2, май наистина не си е мислил за overload. Друг е въпросът дали си е мислил и за override, предвид предположението му, че ще се извика метода на базовия клас.
EroS, това поведение, което описваш е характерно за методите с ранно свързване - точно затова е ранно. В Джава всички методи са виртуални, т.е. с късно свързване. С ранно свързване няма как компилаторът да знае предварително (по време на компилация) от кой точно тип ще бъде обектът, сочен от дадена референция в бъдеще. Още повече, че една и съща референция може веднъж да сочи персийка, друг път ангорска... а стигне ли се и до уличните котки да не ти разправям какво се получава...
EroS, това поведение, което описваш е характерно за методите с ранно свързване - точно затова е ранно. В Джава всички методи са виртуални, т.е. с късно свързване. С ранно свързване няма как компилаторът да знае предварително (по време на компилация) от кой точно тип ще бъде обектът, сочен от дадена референция в бъдеще. Още повече, че една и съща референция може веднъж да сочи персийка, друг път ангорска... а стигне ли се и до уличните котки да не ти разправям какво се получава...
Re: малко помощ?
>> В Джава всички методи са виртуални
Впрочем не всички. Може EroS наистина да е прочел такова нещо, но да е ставало дума за static методи... "дребна" подробност
Впрочем не всички. Може EroS наистина да е прочел такова нещо, но да е ставало дума за static методи... "дребна" подробност
Re: малко помощ?
Не е хубаво да се бърка overload с override. Това е често срещан въпрос на интервюто за работа. Даже има асоциация, която помага да се помни кое кое е.
А за примерният код. Sun-ската Java ще изпълни abc(A a) а пък BeanShell ще изпълни abc(B b). Изненада!
А за примерният код. Sun-ската Java ще изпълни abc(A a) а пък BeanShell ще изпълни abc(B b). Изненада!
Re: малко помощ?
Наистина съм грешка май :-) НО ети и пример, където има разлика:
public class Kotka{
..........
// niama definiran metod "public String get()"
public class Persiiska extends Kotka{
....
public String get(){..something..}
}
main
{
Kotka kotka1 = new Persiiska(type1 par1, ....);
System.out.println( kotka1.get() ); // tozi red dava compile error, tui kato kompilatora tursi method get v class Kotka, a takuv niama.
}
Това имах впредвид по-рано. :-)
public class Kotka{
..........
// niama definiran metod "public String get()"
public class Persiiska extends Kotka{
....
public String get(){..something..}
}
main
{
Kotka kotka1 = new Persiiska(type1 par1, ....);
System.out.println( kotka1.get() ); // tozi red dava compile error, tui kato kompilatora tursi method get v class Kotka, a takuv niama.
}
Това имах впредвид по-рано. :-)
Re: малко помощ?
>> А за примерният код. Sun-ската Java ще изпълни abc(A a) а пък BeanShell ще изпълни abc(B b). Изненада!
Много интересно... това пробвал ли си го?
Мързи ме да се ровя в JLC да видя дали това е споменато, но или BeanShell не е много compatible, или Сън са допуснали сериозен пропуск ако не са уточнили в спеца какво трябва да е поведението в този случай!
Иначе определянето по реалния тип обикновено би било по-удобно, но едва ли си струва overhead-а... Абе по-важното в случая е да има ясно поведение с цел съвместимост...
Много интересно... това пробвал ли си го?
Мързи ме да се ровя в JLC да видя дали това е споменато, но или BeanShell не е много compatible, или Сън са допуснали сериозен пропуск ако не са уточнили в спеца какво трябва да е поведението в този случай!
Иначе определянето по реалния тип обикновено би било по-удобно, но едва ли си струва overhead-а... Абе по-важното в случая е да има ясно поведение с цел съвместимост...
Re: малко помощ?
Разбира се пробвах го. Аз самият се чудех кое ще бъде, защото и двете ми се струват еднакво логични.
И лично не пиша и не препоръчвам писането на overloaded функции които се различават само по параметер от една и съща йерархия, защото това е обратното на писането на generic код, а аз съм привърженик на този стил.
Но в случая Sun са правите разбира се, защото BeanShell е Java интерпретатор. Но това не трябва да ви успокоява, защото е много популярен Java интерпретатор и се използва широко в различни по-големи приложения, например репорт генератор-а JasperReports. Използва се като embeded компилатор предимно.
И лично мисля, че Java е много смешен език.
И лично не пиша и не препоръчвам писането на overloaded функции които се различават само по параметер от една и съща йерархия, защото това е обратното на писането на generic код, а аз съм привърженик на този стил.
Но в случая Sun са правите разбира се, защото BeanShell е Java интерпретатор. Но това не трябва да ви успокоява, защото е много популярен Java интерпретатор и се използва широко в различни по-големи приложения, например репорт генератор-а JasperReports. Използва се като embeded компилатор предимно.
И лично мисля, че Java е много смешен език.