toss Skrevet 15. desember 2008 Del Skrevet 15. desember 2008 (endret) class HelloWorldApp { public static void main(String[] args){ System.out.println("Hello World!"); //Display the string } } class hallaMan { public static void halla() { System.out.println("Halla man! \nWhats up?"); //Skrive ut string } } class print { public static void main(String[] args){ //Lage objekter HelloWorldApp helloWorld = new HelloWorldApp(); hallaMan hallaObj = new hallaMan(); //kalle metoden halla hallaObj.halla(); } } Har kopiert Hello World-programmet, og prøvd å utvide det litt med mine veldig begrensede kunnskaper innen java, og har et par spørsmål. 1. Hva betyr public static void main(String[] args)? har prøvd å finne en forklaring på dette, men har ikke funnet noen god.. 2. Jeg har prøvd å lage en klasse, print, som skal skrive ut både "Hello World" og "Halla man! Whats up?" Hvordan kan jeg kalle denne klassen i kildekoden? 3. Bruker drJava, så jeg har til nå bare skrevet java print, men jeg får bare ut "Halla man! Whats up?" Hvorfor? Hva kan jeg gjøre for å få ut begge tekstene? Tusen takk for svar! EDIT: Skrivefeil Endret 15. desember 2008 av toss Lenke til kommentar
Thorsen Skrevet 15. desember 2008 Del Skrevet 15. desember 2008 public - gjør at metoden er synlig utenfra, dvs den kan kalles opp fra andre klasser. Dette er i motsetning til private som bare kan kalles opp fra internt i klassen. static - en statisk metode, opererer ikke på et objekt. void - betyr at det ikke er noe returverdi fra metoden. (return ...) main - hovedmetode, den som startes når klassen kjøres Strings[] - datatypen til argumentene som kan tas inn i metoden, dette er en string tabell, altså en tabell at tekststrenger. args - navnet på argumentene som taes inn. args er somregel en eller flere kommandolinjeargumenter. Lenke til kommentar
toss Skrevet 15. desember 2008 Forfatter Del Skrevet 15. desember 2008 Takk for svar! Men hva er motsetningen til static? At det ikke står noe om det? Og hva skjer i praksis når jeg skriver Sting[] args etter main? Og hva om jeg ikke skriver det? Vil den da ikke være mottagelig for argumenter? Og dersom jeg skal ha en metode som skal kunne ta imot tre argumenter, kan det da bli (Sting[] a b c)? Lenke til kommentar
Thorsen Skrevet 15. desember 2008 Del Skrevet 15. desember 2008 Motsetningen til static er at det ikke står noe der. String[] args er en tabell(dette ser vi at []). dvs at den kan inneholde flere strenger. args[0] er argument 1 args[1] er argument 2 osv Main er litt "utenfor" og skal alltid stå slik den gjør. Husk at datatypen er viktig for hvilke argumenter/parametere du overfører til en metode. Dersom du f.eks skal ha en metode som regner ut summen av to heltall er det normalt å bruke int. eks. //Regner ut og printer summen public static void sum(int a, int b){ int c = a + b; System.out.println("Summen av " +a +" + " +b +" = " +c); } Et helt program for dette, kan lages slik: public class sum { public static void main(String[] args) { //Kaller undermetode med 2paremetre som begge er heltall sum(1,5); } public static void sum(int a, int b){ int c = a + b; System.out.println("Summen av " +a +" + " +b +" = " +c); } } Utskriften vil her vise: Summen av 1 + 5 = 6 Lenke til kommentar
LostOblivion Skrevet 15. desember 2008 Del Skrevet 15. desember 2008 Man kan vel si på en enkel måte at en static metode eller variabel opererer på klassen, og ikke objektene du lager. F eks, kan du skrive hallaMan.halla() i koden din, i stedet for hallaMan hallaObj = new hallaMan(); hallaObj.halla();. Lenke til kommentar
toss Skrevet 15. desember 2008 Forfatter Del Skrevet 15. desember 2008 Takker for gode svar! Hva skjer om jeg skriver public static void main() i stedet? Rett og slett dropper innholdet i parantesene? For Strings args inneholder vel ikke noe i programmet mitt? Og hvordan kan jeg i klassen print kalle HelloWorldApp.main? Og det virker litt som om all koden må ligge i klasser, og at forskjellige klasser bare kaller hverandre. Er det slik det fungerer, eller kan kode også stå helt fritt? Lenke til kommentar
RavnTM Skrevet 16. desember 2008 Del Skrevet 16. desember 2008 (endret) Hva skjer om jeg skriver public static void main() i stedet? Rett og slett dropper innholdet i parantesene? For Strings args inneholder vel ikke noe i programmet mitt? Hvis du ikke tar med String[] args, så er det ikke 'main' metoden! Når du kjører programmet med kommandoen java Program, så kaller JVM-en(Java Virtual Machine) main(String[]) metoden i klassen som heter Program. Alle metoder har en "signatur", altså hva som definerer akkurat den metoden. Du kan ha flere metoder som heter main, men når du bruker java kommandoen, kalles den som har signaturen main(String[]). Meningen med String[] args er hvis du for eksempel skal lage programmer som tar filer som input, og istedenfor å måtte spørre brukeren når programmet kjører, kan du bare starte programmet med kommandoen java Program minfil.txt, for da settes args[0](første element i listen) lik "minfil.txt", som du senere kan bruke i programmet. Og hvordan kan jeg i klassen print kalle HelloWorldApp.main? Akkurat som du kaller andre metoder. Du kan enten lage en tom array av typen String som du kan bruke som parameter slik: String[] tomListe = { }; HelloWorldApp.main(tomListe); , eller så kan du bruke nøkkelordet null, som betyr "ingenting": HelloWorldApp.main(null); Og det virker litt som om all koden må ligge i klasser, og at forskjellige klasser bare kaller hverandre. Er det slik det fungerer, eller kan kode også stå helt fritt? All kode må være i en klasse. I java kan du ikke "kjøre" en fil, du kan bare kalle metoder i klasser. Håper dette hjelper. PS. Kan være litt rotete, jeg er trøtt. Endret 16. desember 2008 av RavnTM Lenke til kommentar
toss Skrevet 16. desember 2008 Forfatter Del Skrevet 16. desember 2008 Kjempe! Begynner å forstå ting nå.. Men kan et array inneholde flere datatyper? Hva om main(String[] args) gjerne skulle tatt imot en string og en int? Lenke til kommentar
RavnTM Skrevet 16. desember 2008 Del Skrevet 16. desember 2008 (endret) Kjempe! Begynner å forstå ting nå..Men kan et array inneholde flere datatyper? Hva om main(String[] args) gjerne skulle tatt imot en string og en int? main metoden må ha signaturen main(String[]) hvis du vil kalle den med java kommandoen. Hvis du har et program som skal ha numeriske argumenter, så må du "parse" dem. For å "parse" en int, kan du bruke metoden Integer.parseInt(String), som tar ett argument; en String. Eksempel: public class Kvadrat { public static void main(String[] args) { String førsteElement = args[0]; int tall = Integer.parseInt(førsteElement); int kvadrat = tall * tall; System.out.println( tall + "^2 = " + kvadrat ); } } Når du kjører programmet sånn her: java Kvadrat 3 så printer det ut 3^2 = 9. Du kan bruke samme metode for flytetall også, men da må du bruke metoden Double.parseDouble(String) istedenfor. Ta en titt på Array siden til Sun, så forstår du sikkert String[] args bedre. Endret 16. desember 2008 av RavnTM Lenke til kommentar
toss Skrevet 16. desember 2008 Forfatter Del Skrevet 16. desember 2008 Oki! Tror jeg skjønner nå! Men har et til spørsmål. Har prøvd å lage en enkel kalkulator hvor jeg kan skrive inn f.eks. 3 pluss 2, men får det ikke helt til. /** * Calculator * Denne applikasjonen skal kunne gjøre enkle regnestykker. */ class Calc { public static void main(String[] args) { int element1 = Integer.parseInt(args[0]); String opperasjon = args[1]; int element2 = Integer.parseInt(args[2]); System.out.println("Velkommen til Calculator"); if ((opperasjon == "pluss") | (opperasjon == "+")) { sum(element1, element2); } else if (opperasjon == "minus" | opperasjon == "-") { sub(element1, element2); } else if (opperasjon == "delt på" | opperasjon == "/") { div(element1, element2); } else if (opperasjon == "ganger" | opperasjon == "*") { mult(element1, element2); } else { System.out.println("Input ikke gyldig! Regnemåte er "+opperasjon+"!"); } } public static void sum(int a, int b) { int c = a + b; System.out.println("Summen av " +a+" og "+b+" blir "+c+"!"); } public static void sub(int a, int b) { int c = a - b; System.out.println(a+" minus "+b+" blir "+c+"!"); } public static void div(int a, int b) { int c = a / b; System.out.println(a+" delt på "+b+" blir "+c+"!"); } public static void mult(int a, int b) { int c = a * b; System.out.println(a+" ganger "+b+" blir "+c+"!"); } } Jeg får bare ut: Velkommen til Calculator Input ikke gyldig! Regnemåte er minus! Ser ut som om noe er gale med if-setningen. Den kjenner ikke igjen opperasjonene. Noen tips her? Lenke til kommentar
Thorsen Skrevet 16. desember 2008 Del Skrevet 16. desember 2008 (endret) Du har gjort en helt vanlig nybegynnerfeil ikke noe stort. String a; String b; if(a == b) {........} Tester om minneadressen til streng a er den samme som minneadressen til streng b. Den tester altså ikke om innholdet er det samme. Du vil heller bruke .equals som tester om innholdet er likt. For sum blir det da: if ((opperasjon.equals("pluss") | (opperasjon.equals("+")))) { sum(element1, element2); } Dersom du også vi ignorere store og små bokstave kan du bruke: opperasjon.equalsIgnoreCase("pluss") Endret 16. desember 2008 av Thorsen Lenke til kommentar
Cyberfrog Skrevet 17. desember 2008 Del Skrevet 17. desember 2008 Kanskje du også vil ha nytte av noe sånt som switch(operasjonTegn) { case '+': sum(element1, element2); break; case '-': // osv. inntil... default: System.out.println("Operasjonen støttes ikke."); // Eller noe slikt } Du kan ikke i Java bruke switch med strenger (så f.eks. case: "pluss" // osv går ikke). Du kan bruke charAt(index) for å finne tegnet i strengen som finnes på plass index: char operasjonTegn = args[1].charAt(0); Ikke at å gjøre det slik nødvendigvis er mer "korrekt", men du kan bruke mindre plass på å oppnå det samme, i mange tilfeller oppnå ryddigere kode... Merk at "break" er nødvendig for hver mulighet, ellers vil kode i case-en/case-ene under også kjøres (inntil et "break" gjøres eller siste case er unnagjort). Lenke til kommentar
toss Skrevet 17. desember 2008 Forfatter Del Skrevet 17. desember 2008 (endret) Takk for gode svar! Har tenkt å lage en metode for å faktorisere et tall, så da trenger jeg å kunne sjekke om en variabel er et heltall eller ikke. Hvordan gjør jeg dette? Og den primitive typen int kan vel ikke være annet enn heltall? Må jeg i så fall bruke number i stedet? EDIT: Har et forslag til hvordan jeg vil gjøre det, men vet ikke om det er den beste måten å gjøre det på.. Number a = new Number; a = 3,2; if(a.equals(a.intValue)){ System.out.println("a er en integer"); } else { System.out.println("a er ikke en integer"); } Endret 17. desember 2008 av toss Lenke til kommentar
Thorsen Skrevet 17. desember 2008 Del Skrevet 17. desember 2008 double er normalt flyttall (kommatall). Husk også at du bruker punktom for komma. En mulighet er å gjøre slik som dette: //Lager en double variabel (et flyttall) double a = 5.29; //Caster til int, dvs vi tar vare på tallet foran komma som et heltall int b = (int) a; //Dersom a er lik b må a ikke ha desimaler, og er derfor et heltall. if(b==a){ System.out.println("heltall"); } else{ System.out.println("ikke heltall"); } Utskriften vil være ikke heltall men dersom a = 5.00 vil den være heltall Lenke til kommentar
toss Skrevet 17. desember 2008 Forfatter Del Skrevet 17. desember 2008 Oki. Men vil det fungere å teste om a og b er like med == her, eller var det bare en rask forklarende måte å skrive det på? Og jeg kan nå få regnestykker med enten to eller tre deler, altså må koden fungere uansett om args[] har to eller tre indexer. Hvordan kan jeg gjøre koden uavhengig av det? Prøvde med en setning som denne if(Array.getLength(args) > 2) {String element3 = args[2];} men det går ikke.. Prøver altså å sjekke lengden til args, og dersom den er større enn 2 opprettes element 3. Får følgende feilmelding: cannot find symbol symbol : variable Array location: class Calc Lenke til kommentar
RavnTM Skrevet 17. desember 2008 Del Skrevet 17. desember 2008 (endret) Oki. Men vil det fungere å teste om a og b er like med == her, eller var det bare en rask forklarende måte å skrive det på? Med primitive typer (int, double, float, char, byte, long, short, boolean), kan man bruke ==, men med objekter(som String, Object, Random, PrintStream, File) må man bruke .equals hvis man vil sjekke om de er "like". == Samme adresse(primitive typer har alltid lik adresse. 1 og 1 kan jo ikke være to forskjellige steder. ) Man bruker dette også med objekter, men da er det for å sjekke om det er samme objekt. // Lager to objekter av klassen Integer // som begge har verdien 1. Integer a = new Integer( 1 ); Integer b = new Integer( 1 ); if (a == b) { // Kan ikke skje, siden a og b ikke er samme objekt } if (a.equals(b)) { // Siden Integer klassen definerer equals metoden // sin sånn at den ser om int-verdiene er like, så // er a.equals(b) lik true. } .equals En metode som er definert i klassen. String klassen definerer metoden sånn at den sjekker om alle bokstaver er like. Den ser omtrent sånn her ut: public boolean equals(Object obj) { if ( !(obj instanceof String) ) return false; char[] bokstaverObj = ((String)obj).toCharArray(); char[] bokstaverMeg = this.toCharArray(); if (bokstaverObj.length != bokstaverMeg.length) return false; for (int i = 0; i < bokstaverObj.length; i++) { if (bokstaverObj[i] != bokstaverMeg[i]) return false; } return true; } (Den ser selvfølgelig ikke akkurat sånn ut, men det var bare et eksempel på klasse-definerte equals-metoder) if(Array.getLength(args) > 2) {String element3 = args[2];} Alle arrayer har en variabel "length", som du kan aksessere for å sjekke antall elementer. Eksempel: public static void main(String[] args) { int lendge = args.length; // Henter antall elementer if (length == 0) { System.out.println( "Feil!" ); System.exit(1); // Stopper programmet } ... } Endret 17. desember 2008 av RavnTM Lenke til kommentar
toss Skrevet 17. desember 2008 Forfatter Del Skrevet 17. desember 2008 Strålende! Men det er en ting jeg ikke skjønner.. Et objekt kan jo inneholde flere felter, eller variabler? sammenligner den i så fall alle? Og hva med metoder? Dette er kanskje veldig teit :/ Men kan man bruke .equals på objekter av forskjellig klasse? Det gir jo på en måte ikke mening å gjøre det.. Lenke til kommentar
RavnTM Skrevet 18. desember 2008 Del Skrevet 18. desember 2008 Strålende! Men det er en ting jeg ikke skjønner.. Et objekt kan jo inneholde flere felter, eller variabler? sammenligner den i så fall alle? Og hva med metoder?Dette er kanskje veldig teit :/ Men kan man bruke .equals på objekter av forskjellig klasse? Det gir jo på en måte ikke mening å gjøre det.. Hvilke variabler .equals metoden sjekker er definert i klassen. Du kan prøve å lage en klasse som definerer sin egen equals metode og leke litt rundt med den. class Website { String url; public boolean equals(Object obj) { Website site = (Website) obj; // Må "caste" den return site.url.equals(url); } } Det er omtrent som toString metoden som alle klasser har. File klassens toString metode: fil navnet Integer klassens toString metode: tallet URL klassens toString metode: adressen Hvis toString metoden ikke er definert i en klasse, så brukes Object.toString, som bare printer navnet på klassen og hashCode. Det er akkurat det samme med equals metoden, bare at den returnerer sann/usann istedenfor en String. Lenke til kommentar
toss Skrevet 18. desember 2008 Forfatter Del Skrevet 18. desember 2008 Igjen, tusen takk for svar! Har som vanlig enda flere spørsmål.. Hva skjer egentlig her? double a = 5,29; int b = (int) a; Jeg kjenner ikke igjen syntaksen. Har ikke sett noe lignende til (int) før. Og hvordan vet man om de ulike variablene som finnes til de ulike klassene, som .length? Har sett en del her: http://java.sun.com/javase/6/docs/api/index.html, noe som tilsvarer manualen i php, virker det som. Hva kaller dere denne forresten? Men jeg finner ikke hvilke variabler som er tilknyttet de ulike klassene, bare metodene. Lenke til kommentar
Cyberfrog Skrevet 18. desember 2008 Del Skrevet 18. desember 2008 (endret) Typisk kunne du ikke benyttet objektenes variabler (eller "felt" som man gjerne kaller dem) direkte uansett, da de som regel ikke er deklarert som "public". Se etter get- og set- metoder (og lignende) for å manipulere objektenes indre tilstand. Når det gjelder (int) så kan det vel i dette tilfellet ses som en beskjed til kompilatoren: "Ja, jeg vet jeg mister presisjon ved å konvertere en double-variabel til int" Å gå motsatt, fra int til double kan du gjøre uten videre (konverteringen vil bli utført uten at du trenger å bruke casting, som det kalles). Masse detaljer (pugging høyst unødvendig ): http://java.sun.com/docs/books/jls/third_e...onversions.html Ellers flott at du har funnet API-en. En annen Sun-ressurs som kommer til nytte, også for folk med litt mer erfaring, er tutorialsene: http://java.sun.com/docs/books/tutorial/index.html Eksempel for det første poenget mitt i dette innlegget: http://java.sun.com/docs/books/tutorial/ja...esscontrol.html Endret 18. desember 2008 av Cyberfrog Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå