Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Voin käyttää vain yhdennimisiä luokkia?

Sivun loppuun

Juhko [03.02.2009 18:33:26]

#

Yritän opetella Javaa ja nyt kokeilin applettien tekemistä Sunin oppaan avulla. Nappulan lisääminen onnistui hyvin, mutta kun yritin luoda uuden luokan, tulee seuraavat virheilmoitukset:

class Beeper is public, should be declared in a file named Beeper.java

cannot find symbol

cannot find symbol : class ActionEvent

Koodi on tässä:

import java.applet.*;
import java.awt.*;

public class applet_testi extends Applet {
	public void init() {
		Button nappula = new Button("Paina");
		add(nappula);
	}
}

public class Beeper implements ActionListener {
	public void actionPerformed(ActionEvent event) {
		Component c = (Component)event.getSource();
		c.getToolkit().beep();
	}
}

Kääntäjä on Xcode 2.0, ja käytän Mac OS X:ää.

p.s. Tämä sama luokkaongelma tulee kaikkien Java-ohjelmieni kanssa, ja on ollut jo pitkään; nyt päätin kysyä täältä neuvoa.

Grez [03.02.2009 18:58:16]

#

Idea on, että laitat kunkin julkisen luokan omaan tiedostoonsa ja nimeät tiedoston luokan mukaan. Eli luokan voit nimetä miten haluat ja niitä voit tehdä kuinka monta haluat, kunhan ne ei ole kaikki samassa tiedostossa.

Juhko [03.02.2009 19:03:01]

#

Joo kiitti, luokkaongelma tuli ratkaistuksi, mutta kääntäjä heittää yhä noita kahta muuta erroria. Mistähän mahtaa johtua...

Metabolix [03.02.2009 19:03:18]

#

Juhko kirjoitti:

class Beeper is public, should be declared in a file named Beeper.java

Tiivistelmä (lihavoidut kohdat):
class Beeper should be in Beeper.java.
Beeper-luokan pitäisi olla tiedostossa Beeper.java.

os [03.02.2009 19:06:37]

#

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/ActionEvent.html:

java.awt.event
Class ActionEvent
...

siis:

import java.awt.event.ActionEvent;

tai

import java.awt.event.*;

Pelkkä import java.awt.*; ei riitä (miksköhän ei...?). Tähän halpaan olen itsekin mennyt.

Grez [03.02.2009 19:20:28]

#

os kirjoitti:

(miksköhän ei...?)

Koska importissa * ei korvaa .:ttä.

os [03.02.2009 19:22:06]

#

Niin, mutta miksi ei korvaa? :)

EDIT: varmaan siksi, että ko. luokka olisi nyt event.ActionEvent. Ihan loogista, jos vähän tarkemmin ajattelee.

Metabolix [03.02.2009 19:29:35]

#

os kirjoitti:

Niin, mutta miksi ei korvaa? :)

Kyseessä on minusta aivan vastaava tilanne kuin vaikka C++:n nimiavaruuksien kanssa:

namespace A {
 namespace B {
  int x;
 }
}
using namespace A;
int f() {
 return B::x; // x ei riitä, ja hyvä niin.
}

Tai komentorivillä:

rm -f *
# ei onneksi sama kuin rm -rf *

maka78 [03.02.2009 21:44:53]

#

Täytyy vielä mainita, kun sitä ei kukaan muu maininnut. Eli Tuota "class Beeper is public, should be declared in a file named Beeper.java" herjaahan ei tulisi myöskään jos Beeper luokkaa ei olisi määritetty julkiseksi, vaan tuo koodi olisi näin:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class applet_testi extends Applet {
    public void init() {
        Button nappula = new Button("Paina");
        add(nappula);
    }
}

class Beeper implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        Component c = (Component)event.getSource();
        c.getToolkit().beep();
    }
}

Tommittaja [03.02.2009 22:06:27]

#

niin, eihän missään ohjelmassa voi olla kuin yksi julkinen luokka ja muut aliluokkia.

Metabolix [03.02.2009 22:36:26]

#

Tommittaja kirjoitti:

niin, eihän missään ohjelmassa voi olla kuin yksi julkinen luokka ja muut aliluokkia.

Nyt meni taas pahasti metsään.

// A.java
public class A {
  public static int lkm;
  public static void main(String [] args) {
    ++lkm;
    System.out.println("A: " + lkm);
    if (lkm < 2) {
      B.main(args);
    }
  }
}
// B.java
public class B {
  public static int lkm;
  public static void main(String [] args) {
    ++lkm;
    System.out.println("B: " + lkm);
    if (lkm < 2) {
      A.main(args);
    }
  }
}
# java A
A: 1
B: 1
A: 2
# java B
B: 1
A: 1
B: 2

Kaksi (omaa) julkista luokkaa, kaksi java-tiedostoa kaksi class-tiedostoa, kaksi erilaista ohjelmaa, joista kumpikin käyttää molempia luokkia.

Sami [04.02.2009 00:47:50]

#

Ja tuossakin esimerkissä on käytetty myös noiden A:n ja B:n lisäksi näkyvästi kahta muutakin julkista luokkaa: String ja System.
Sitten siellä enemmän tai vähemmän taustalla on käytetty sitäkin useampia (julkisia) luokkia, kuten Object (kaikkien luokkien yliluokka), PrintStream (System.out on tämän luokan ilmentymä) tai ClassLoader (latailee noita muita luokkia).

Tommittaja [04.02.2009 08:46:37]

#

jaa.. no sitten :S

Juhko [05.02.2009 15:49:51]

#

Sain toimimaan, kiitos ohjeista.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta