Gå til innhold

Nybegynnerspørsmål, public static void main(String[] args)


Anbefalte innlegg

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 av toss
Lenke til kommentar
Videoannonse
Annonse

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

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

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

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
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. :p

Endret av RavnTM
Lenke til kommentar
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 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 av RavnTM
Lenke til kommentar

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

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 av Thorsen
Lenke til kommentar

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

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 av toss
Lenke til kommentar

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

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
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 av RavnTM
Lenke til kommentar

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
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

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

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 av Cyberfrog
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...