Avatar billede freddy04 Nybegynder
27. august 2005 - 12:55 Der er 34 kommentarer og
1 løsning

arrayList driller

Det her VIl åbenbart ikke virke - nogen der kan hjælpe ?

Jeg prøver at importere en klasse kaldet Bibliotek som arver (tror jeg nok det hedder) fra arraylist. Altså så klassen er en arraylist :

public class Bibliotek extends java.util.ArrayList<Dokumenter>implements java.io.Serializable

I min klasse hvor jeg så importere Gruppe.Bibliotek klassen, prøver jeg så følgende:

Bibliotek.add(new Dokumenter("Titel", "Indhold", "Afsender");

Fejlen siger noget med en statisk reference til et ikke statisk objekt...
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:00 #1
Bibliotek b = new Bibliotek();
b.add(new Dokumenter("Titel", "Indhold", "Afsender");
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:01 #2
Og så lige en ekstra:  )
Avatar billede arne_v Ekspert
27. august 2005 - 13:19 #3
fordi add er en ikke static metode skal den kaldes på et objekt og ikke på en klasse

overvej iøvrigt at lade Bibliotek indeholde en ArrayList fremfor at extende ArrayList
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:27 #4
OK ja det virker på dette problem, men hvad så når jeg nu opretter et objekt af Bibliotek.

Jeg har en metode som tilføjer et dokument (som ovenfor) og her løses problemet, men hvad så med en anden metode jeg har som gemmer biblioteket i en fil. Her kan den nu ikke genkende b fordi den er oprettet i en anden metode.
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:27 #5
Så opretter du den bare udenfor.
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:29 #6
jeg kunne selvfølgelig godt gøre det hele i samme metode, så ville problemet vel ikke eksistere, men det er vel bedst programmeringsskik at dele op i metoder?
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:30 #7
altså i main ? men det er vel også en slags metode
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:31 #8
Du opretter din i klassen, fx lige under din "public class whetever {"
Avatar billede arne_v Ekspert
27. august 2005 - 13:32 #9
eller du kunnde sende din b med over som argument til din save metode
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:35 #10
ok ja det virker dælme, men er det virkelig den sådan helt bedste stil? jeg mener, det virker da lidt rodet at oprette objekter oppe i begyndelsen af en klasse, som først bruges langt nede i et par metoder...sikkert bare mig der skal lære det :-)

Smid et svar erikjacobsen og tak for hjælpen
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:36 #11
åhh ja det var faktisk også en mulighed, måske lidt mere overskuelig,
smid et svar arnev hvis du også vil score lidt point :-)
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:38 #12
Ingen point til mig, tak. Ja, men laver variabler i klasser. Du kan så overveje om den skal være 'private' eller 'public'.
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:41 #13
et tillægsspørgsmål:
bør man gøre det samme med fx:  Scanner s = new Scanner(System.in);

altså lave den oppe i toppen lige under class, i stedet for at gøre det i hver enkelt metode hvor man indlæser med scanner ?
Avatar billede arne_v Ekspert
27. august 2005 - 13:44 #14
den var nok oplagt at have som field i din class
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:44 #15
hmm ja og endnu et tillægsspørgsmål (kommer nok til at hæve pointene lidt :-)

Hvad så med statiske metoder i Biblioteks klassen som jeg nu opretter et objekt af, dem kan jeg vel så ikke bruge mere ? Har fx en klasse der åbner et bibliotek fra en gemt fil som er statisk, hvordan skal jeg så bruge den nu hvor der er oprettet et objekt?
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:46 #16
I java kan du kalde din statiske metode både med
  Bibliotek.statisk();
og
  b.statisk();

Det første er pænest, syn's jeg.
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:46 #17
med field mener du ligesom erikjacobsen 27/08-2005 13:31:08 ?
Avatar billede arne_v Ekspert
27. august 2005 - 13:47 #18
ja
Avatar billede arne_v Ekspert
27. august 2005 - 13:48 #19
I nyeste version af Eclipse får man faktisk en lille advarsel hvis man kalde
en statisk metode på et objekt
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:49 #20
Eclipse siger at den statisk metode åbenFil fra Bibliotek skal accesses på en statisk måde ? altså når jeg har b.åbenfrafil(filnavn); i metoden som åbner filen.
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:50 #21
ja præcis, men jeg kan måske sadig køre den -havde ikke set det kun var en "advarsel"
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:51 #22
Ikke alle Java-lignende sprog tillader "advarsels"-versionen, så du kan bare vænne dig til at bruge den anden ;)
Avatar billede arne_v Ekspert
27. august 2005 - 13:52 #23
ja

men hvorfor ikke rette det til Bibliotek.åbenfrafil(filnavn)
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:54 #24
Med den anden mener du så Bibliotek.statisk(); men så kan jeg jo ikke oprette den som objekt. Bør man så ikke have både statisk og ikke-statiske metoder i samme klasse?
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:57 #25
fordi jeg jo gemmer og tilføjer dokumenter til et objekt af Biblioteksklassen kaldet b (som lært ovenfor)
Avatar billede freddy04 Nybegynder
27. august 2005 - 13:59 #26
Kan man så på en eller anden måde gøre følgende :
Bibliotek.åbenfrafil();
b=Bibliotek();
b.add()
b.gemtilfil()
Avatar billede erikjacobsen Ekspert
27. august 2005 - 13:59 #27
Man kan have både statiske og ikke-statiske, men hvis du skal bruge noget det objekt du putter ting i, så skal den jo ikke være statisk.
Avatar billede erikjacobsen Ekspert
27. august 2005 - 14:00 #28
åbenfrafil() skal næppe være statisk.
Avatar billede freddy04 Nybegynder
27. august 2005 - 14:02 #29
hmm det er den nu :-)
Avatar billede arne_v Ekspert
27. august 2005 - 14:05 #30
ikke statisk og:

Bibliotek b = new Biliotek();
b.load(filnavn);
// diverse b.add og b.remove
b.save(filnavn);

eller statisk og:

Bibliotek b = Bibliotek.load(filnavn);
// diverse b.add og b.remove
b.save(filnavn);
Avatar billede freddy04 Nybegynder
27. august 2005 - 14:17 #31
Super, så er jeg vist blevet lidt klogere :-)
hvis jeg bruger den sidste mulighed du nævner så skal jeg jo bare skrive b=Bibliotek.load(filnavn); da b allerede er oprettet i toppen som jeg jo opdagede før :-)
Avatar billede freddy04 Nybegynder
27. august 2005 - 15:49 #32
Ok sidste tillægsspørgsmål for denne gang (i dette spg i hvert fald :-)

Ifølge: http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html#lastIndexOf(java.lang.Object)
så skal lastIndexOf modtage et objekt, er det navnet på et reelt objekt, eller bare klassen?

Altså skal jeg skrive :
int i = b.lastIndexOf(Dokumenter);

eller
Dokumenter temp = new Dokumenter("","","");
int i = b.lastIndexOf(temp);

Ingen af delene ser helt ud til at virke, er der evt en anden måde at få returneret hvor mange objekter der er i arraylisten ?

Og arne_v læg et svar hvis du vil have point
Avatar billede arne_v Ekspert
27. august 2005 - 15:50 #33
det sidste

og det virker hvis din Dokumenter klasse har en fornuftig equals metode

og svar
Avatar billede freddy04 Nybegynder
27. august 2005 - 15:59 #34
Ok jeg bliver ved med at få -1 returneret selvom jeg tilføjer til listen. Jeg går ud fra det så er fordi den sammenligner også på objekternes indhold og det er jo forskelligt.
Men jeg kan vel lave noget med isEmpty istedet for og så tage dem en af gangen til listen er tom
Avatar billede freddy04 Nybegynder
27. august 2005 - 16:05 #35
haha glem det, jeg kan jo bare bruge size();
tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester