[Java] beginner: Iets simpels, 2 getallen optellen al fout

Pagina: 1
Acties:
  • 1.811 views sinds 30-01-2008
  • Reageer

  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 07-03 23:42
Als je een java boek leest, lijkt het allemaal zo makkelijk, maar als ik dan wat probeer, krijg ik al een foutmelding voor ik met eclipse kan compilen :?
Zit nu al een uur te puzzelen op zoiets simpels als dit, maar hij blijft zeuren over een static die geen non static kan oproepen :'(


Ik begrijp dat je altijd main nodig hebt. Vanuit main roep je een methode aan met 2 parameters, heb ik gedaan. De methode addUp telt die 2 parameters op en moet het resultaat weer teruggeven aan de aanroeper (v) in main en die tonen. Wat doe ik toch fout?


public class AddUp
{

public static void main(String[] args)
{
int x = 2, y = 3, v;
v = addUp(x, y);
System.out.println(v);
}


public int addUp(int x, int y)
{
return x + y;
}


}

[ Voor 3% gewijzigd door ErikRo op 08-02-2006 14:01 ]

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:42

Creepy

Tactical Espionage Splatterer

Weet je wat het verschil is tussen een static method en een non static method?

addUp is non-static. Je kan dus addUp niet aanroepen zonder dat je eerst een class instantieert. Je zult dus een instantie van het type AddUp moeten maken ( AddUp varnaam = new AddUp() ).

Vervolgens kan je van deze instantie de addUp method aanroepen (varnaam.addUp(3,4)).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:44

Gonadan

Admin Beeld & Geluid, Harde Waren
of je maakt er
Java:
1
public static int addUp(int x, int y) {..}
van.

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 07-03 23:42
Dat static / non static is me inderdaad (nog) niet duidelijk, daar moet ik dan eerst induiken. Had toevallig net zelfs hem eens static gemaakt, ook omdat ik niet wist waar ik die "AddUp varnaam = new AddUp() " kwijt moest. En nu runt hij tenminste dat is al iets :)

Bedankt!

[ Voor 6% gewijzigd door ErikRo op 08-02-2006 14:14 ]

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:44

Gonadan

Admin Beeld & Geluid, Harde Waren
ErikRo schreef op woensdag 08 februari 2006 @ 14:14:
Dat static / non static is me inderdaad (nog) niet duidelijk, daar moet ik dan eerst induiken. Had toevallig net zelfs hem eens static gemaakt, ook omdat ik niet wist waar ik die "AddUp varnaam = new AddUp() " kwijt moest. En nu runt hij tenminste dat is al iets :)

Bedankt!
Die zet je in de main.
Een main wordt 1 keer gestart en alles daarin uitgevoerd. Alles wat je daaruit aanroept moet dus ook static zijn.
non-static methoden kan je aanroepen als je van een Object eerst een instantie hebt gemaakt.
zo kan je dus met AddUp varnaam = new Addup() een instantie van je klasse maken

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Opzich geeft Eclipse een mooie waarschuwing als je zo'n fout maakt:
Cannot make a static reference to the non-static method addUp(int, int) from the type AddUp (ofzoiets)

Als je dan op het rode kruisje klikt voor de regel code die fout is, dan geeft Eclipse soms keuzemogelijkheden om dit te corrigeren.
In dit geval iets als: Change modifier of addUp()to static. Handig! :)

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Verwijderd

Een methode die geen gebruik maakt van properties, en dus hooguit van de argumenten, kun je in principe gewoon static maken. Er is dan namelijk ook geen enkele reden om het niet te doen. Zo ook in dit geval.

  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 07-03 23:42
Static krijg ik pas over 4 hoofdstukken zie ik.

Hopelijk een niet al te domme vraag, maar ik dacht slim te zijn door bij allebei "static" te verwijderen dan zijn ze tenminste allebei "nonstatic" en zou het ook moeten werken. Dus niet "java.lang.NoSuchMethodError: main" waarom is dat? Moet een main soms altijd static zijn?

Gonadan/Cheeta, mooie uitleg heb ik meteen gekopieerd naar mijn docs :)

[ Voor 6% gewijzigd door ErikRo op 08-02-2006 15:02 ]

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


Verwijderd

ErikRo schreef op woensdag 08 februari 2006 @ 15:01:
Static krijg ik pas over 4 hoofdstukken zie ik.

Hopelijk een niet al te domme vraag, maar ik dacht slim te zijn door bij allebei "static" te verwijderen dan zijn ze tenminste allebei "nonstatic" en zou het ook moeten werken. Dus niet "java.lang.NoSuchMethodError: main" waarom is dat? Moet een main soms altijd static zijn?

Gonadan, mooie uitleg heb ik meteen gekopieerd naar mijn docs :)
Mijns inziens moet main altijd static zijn... Deze wordt namelijk niet gecreeerd als object oid, maar direct aangeroepen als je je programma start.

Ik snap je redenatie niet trouwens. Static wordt in dit topic wel uitgelegd en jij gokt dat het gaat werken door ze beide non-static te maken :? ? Maak die andere even static of creeer een instantie van het object waarin de aan te roepen methode staat, dan werkt het wel :)

[ Voor 23% gewijzigd door Verwijderd op 08-02-2006 15:04 ]


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:44

Gonadan

Admin Beeld & Geluid, Harde Waren
ErikRo schreef op woensdag 08 februari 2006 @ 15:01:
Static krijg ik pas over 4 hoofdstukken zie ik.

Hopelijk een niet al te domme vraag, maar ik dacht slim te zijn door bij allebei "static" te verwijderen dan zijn ze tenminste allebei "nonstatic" en zou het ook moeten werken. Dus niet "java.lang.NoSuchMethodError: main" waarom is dat? Moet een main soms altijd static zijn?
Inderdaad, een main móet static zijn. Die wordt namelijk één keer aangeroepen door de runtime.
Gonadan/Cheeta, mooie uitleg heb ik meteen gekopieerd naar mijn docs :)
O-)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Gonadan schreef op woensdag 08 februari 2006 @ 15:04:

Inderdaad, een main móet static zijn. Die wordt namelijk één keer aangeroepen door de runtime.
Precies. De runtime roept in principe gewoon ClassName.main(args) aan, waarbij args natuurlijk de command line arguments zijn. Er wordt standaard dus géén instantie aangemaakt van de class!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:44

Gonadan

Admin Beeld & Geluid, Harde Waren
Probeer dit maar eens:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class AddUp 
{
  public AddUp() {
    int x = 2, y = 3, v;
    v = addUp(x, y);
    System.out.println(v);
  }

  public static void main(String[] args)
  {
    new AddUp();
  }

  public int addUp(int x, int y)
  {
    return x + y;
  }
}


Dan gebruik je de constructor, en die is niet static. :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Reinder83
  • Registratie: September 2002
  • Laatst online: 10-04 08:57
wat ik altijd doe:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AddUp {
  public static void main(String[] args) {
    new AddUp().start();
  }

  public void start() {
    int x = 2, y = 3, v;
    v = addUp(x, y);
    System.out.println(v);
  }

  public int addUp(int x, int y) {
    return x + y;
  }
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Reinder83: waarom zou je daar niet gewoon een constructor voor gebruiken?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Reinder83 schreef op woensdag 08 februari 2006 @ 15:28:
wat ik altijd doe:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AddUp {
  public static void main(String[] args) {
    new AddUp().start();
  }
}

  public void start() {
    int x = 2, y = 3, v;
    v = addUp(x, y);
    System.out.println(v);
  }

  public int addUp(int x, int y) {
    return x + y;
  }
}
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
  public static void main(String[] args) {
    AddUp a1 = new AddUp();
  }
}

public class AddUp {
  public AddUp() {
    int x = 2, y = 3, v;
    v = addUp(x, y);
    System.out.println(v);
  }

  public static int addUp(int x, int y) {
    return x + y;
  }
}



Lijkt mij vanuit het oogpunt van OO een stuk beter :) Je runt dus alleen de main.
Gonadan schreef op woensdag 08 februari 2006 @ 14:21:
[...]


Die zet je in de main.
Een main wordt 1 keer gestart en alles daarin uitgevoerd. Alles wat je daaruit aanroept moet dus ook static zijn.
non-static methoden kan je aanroepen als je van een Object eerst een instantie hebt gemaakt.
zo kan je dus met AddUp varnaam = new Addup() een instantie van je klasse maken
Even om verwarring te voorkomen: een object is een instantie van een class. Een object kun je niet instantieren, die is namelijk al geinstantieerd. Alleen een class kun je instantieren.

[ Voor 3% gewijzigd door Y0ur1 op 08-02-2006 16:02 ]


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:44

Gonadan

Admin Beeld & Geluid, Harde Waren
[b][message=25170494,noline]

Even om verwarring te voorkomen: een object is een instantie van een class. Een object kun je niet instantieren, die is namelijk al geinstantieerd. Alleen een class kun je instantieren.
Klopt helemaal *spoelt mond*, ik moet natuurlijk wel de termen correct gebruiken.

Maar dat stukje code wat je daarboven hebt gebakken is een beetje jammer.
Het is inderdaad OO, maar op dit punt is OO op die manier niet nuttig.
Dit is dan logischer:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main { 
  public static void main(String[] args) { 
    Calc c1 = new Calc(); 

    int x = 2, y = 3, v; 
    v = c1.addUp(x, y); 
    System.out.println(v); 
  } 
} 

public class Calc { 
  public Calc() { 

  } 

  public int addUp(int x, int y) { 
    return x + y; 
  } 
}

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Gonadan schreef op woensdag 08 februari 2006 @ 16:06:
[...]

Klopt helemaal *spoelt mond*, ik moet natuurlijk wel de termen correct gebruiken.

Maar dat stukje code wat je daarboven hebt gebakken is een beetje jammer.
Het is inderdaad OO, maar op dit punt is OO op die manier niet nuttig.
Dit is dan logischer:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main { 
  public static void main(String[] args) { 
    Calc c1 = new Calc(); 

    int x = 2, y = 3, v; 
    v = c1.addUp(x, y); 
    System.out.println(v); 
  } 
} 

public class Calc { 
  public Calc() { 

  } 

  public int addUp(int x, int y) { 
    return x + y; 
  } 
}
Klopt inderdaad :) een main functie in een gewone klasse gebruiken is een beetje ranzig voor een goede applicatie dus ik dacht ik maak het iets beter maar voor dit voorbeeld maakt het natuurlijk niks uit, jouw voorbeeld is natuurlijk het beste.

@.oisyn: uiteraard, maar als we hem dat nu moeten uitleggen breekt het zweet hem uit denk ik :)

[ Voor 10% gewijzigd door Y0ur1 op 08-02-2006 16:34 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vind dat anders helemaal niet logischer, die addUp is een stateless functie die helemaal geen Calc instance nodig heeft om te werken. Zoals al eerder opgemerkt is addUp gewoon een typische static functie. Vergelijk het met de functies in de Math class (die bovendien ook nog eens abstract en final is, waardoor je 'm niet eens kunt instantieren).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:44

Gonadan

Admin Beeld & Geluid, Harde Waren
.oisyn schreef op woensdag 08 februari 2006 @ 16:20:
[...]


Ik vind dat anders helemaal niet logischer, die addUp is een stateless functie die helemaal geen Calc instance nodig heeft om te werken. Zoals al eerder opgemerkt is addUp gewoon een typische static functie. Vergelijk het met de functies in de Math class (die bovendien ook nog eens abstract en final is, waardoor je 'm niet eens kunt instantieren).
Dat klopt helemaal, maar het ging hier om het OO principe.

We zullen hem later nog wel wrapper klassen uitleggen :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8

Pagina: 1