psevdo abstraktni klasove?

7 отговора 235 прегледа
#1

psevdo abstraktni klasove?

Za6to slednoto se kompilira:
JFileChooser j=new JFileChooser();
j.setFileView(new FileView(){});

sled kato FileView e abstrakten klas? Poglednah dokumentaciqta i vidqh 4e vsy6tnost FileView e deklariran kato abstrakten, no nqma abstraktni metodi. Qvno zatova ne dava gre6ka. No za6to togava klasyt e abstrakten?
Nqkoi popadal li e na ne6to podobno i dokumentirano li e tova?

The things are awlays changing, I feel that it`s allright

Отговор
в отговор на voyager #2

Re: psevdo abstraktni klasove?

new FileView(){}

тоя ред ти създава анонимен (май така беше) клас, който наследява/реализира класа/интерфейса FileView.

Отговор
в отговор на josarjan #3

da, oba4e

pri nasledqvane na abstrakten klas trqbva da se definirat abstraktnite metodi. A nai-strannoto e 4e za FileView ima dve razli4ni dokumentacii:
JavaTM 2 Platform
Standard Edition vsi4ki metodi sa dadeni kato abstraktni. T.e. az trqbva da gi realiziram, ako iskam nasledqva6tiq klas da ne byde abstrakten i sledovatelno da moje da se instancira. Sledovatelno new FileView(){} ne bi trqbvalo da se kompilira, vypreki 4e e vytre6en anonimen klas.
v JavaTM 2 Platform
Std. Ed. v1.4.1 pyk nito edin metod ne e daden kato abstrakten. Tuk izglejda vyzmojno da se instancira, no typoto e, 4e klasyt vse pak e deklariran kato abstrakten v dokumentaciqta!

music non stop

Отговор
в отговор на voyager #4

Re: psevdo abstraktni klasove?

new FileView(){}
Kompilira zaradi { }.Priema 4e predefinira6 klasa. Toi si e abstracten.
Triabva da se implantira za da se izpolzva.A kak se izpolzva moje6 da vidi6 v repertoira na tvoia jdk:
SDK/demo/jfc/FileChooserDemo/src

Отговор
в отговор на ruru #5

Re: psevdo abstraktni klasove?

:( tva go gledah. Problema mi ne e v izpolzvaneto. To se kompilira i si raboti. Problemyt e 4isto teoreti4n - spored mene ne bi trqbvalo da e taka. Pi4ovete v primera na SDK sa raz6irili abstraktniq class i sa rezlizrali metodite mu. Sled tova instancirat raz6ireniq klas, koito ve4e ne e abstrakten. A az ne implementiram kiorav metod. vqrno, instanciram vytre6no ne samiqt FileView, a negov naslednik. Samo 4e sled kato nqsledqva6tiq klas ne definira abstraktnite metodi, toi sy6to e abstrakten. I ne moje da se instancira. Zatova new FileView(){} ne bi trqbvalo da se kompilira.
Edinstvenoto obqsnenie e, 4e avtomati4no se syzdavat prazni realizacii na abstraktnite metodi. No tova nikyde ne e dokumentirano :( Pone az ne sm go vijdal.

Taka de, sled tolkova prikazki, misylta mi e, 4e tyrsq teoreti4no obqsnenie na problema, koito mi se struva adski stranen...

дао дъ дзин

Отговор
в отговор на voyager #6

Ами точно,

защото няма абстрактни методи, затова успява да се компилира, т.е. не е необходимо да наследяваш каквото и да е - просто няма такива методи, които трябва да се наследят задължително.

В случая тоя клас (FileView) се отличава от нормалните класове единствено по това, че не може да се създават обекти от него.

Виж не знам каква е точно дефиницията на абстрактен клас в Java - в C++ абстрактен клас е клас, който има поне една pure-virtual функция (май така беше). В Java явно не е така (тук abstract може да обявиш самия клас). Сигурно дефиницията е, че не не можеш да създаваш обекти от тоя клас (не съм много сигурен).

Отговор
в отговор на voyager #7

Re: psevdo abstraktni klasove?

"Samo 4e sled kato nqsledqva6tiq klas ne definira abstraktnite metodi, toi sy6to e abstrakten." - tuk rabotata e takawa che naslediawashtia (w sluchaia anonimen klas) klas niama nujda da implementira nishto zashtoto metodite na FileView si imat defaultna implementacia. Sledowatelno anonimnia klas koito naslediawa tozi FileView ne e abstrakten i moje da se prawi instatiation.

cheers

Отговор
в отговор на vALE #8

Re: psevdo abstraktni klasove?

ami da! Ti si prav vsy6tnost. Namerih otgovora v specifikaciqta na ezika:
"8.1.1.1 abstract Classes

An abstract class is a class that is incomplete, or to be considered incomplete"
Strannoto e vse pak, 4e nikyde ne e qsno dokumentirano, 4e edin class moje da byde deklariran kato abstrakten, bez v deistvitelno da e takyv /*t.e. da ima abstraktni metodi */.

10x na vsi4ki vse pak, izqsnihme vyprosa

"Така е то", казват тралфамадорците, когато някой умре

Отговор