Avatar billede madslee Nybegynder
23. august 2003 - 01:19 Der er 26 kommentarer

Object og klasser

Hej jeg er rimlig ny i java.. og sidder og roder lidt med java objects

jeg har prøvet at lave et object f.eks

public class dansmedmig
{

double skridt()
{
return 1.0;
}

}



og en anden klasse hvor jeg så vil bruge den

public class dans
{
public static void main(String[] args)
{
dansmedmig d;
d = new dansmedmig();
System.out.println(""+d.skridt);
}
}


så kommer det jeg ikke forstår .. dette her er jo 2 forskellige filer ?? altså en fil til hver klasse
hvordan får jeg de to filer til at "arbejde" sammen ?? altså jeg skal jo på en eller anden måde have min "dans" klasse til at vide at dansmedmig methoden findes... hvordan gør man det ??

skal man import eller sådan noget..

har kigget i nogen manualer og kan simplehen ikke finde svaret!!!
Avatar billede bearhugx Nybegynder
23. august 2003 - 01:38 #1
bemærk parenteser () efter skridt , når du kalder metoden...

public class Dans {
  public static void main(String[] args) {
    DansMedMig dmm;
    dmm = new DansMedMig();
    System.out.println( ""+dmm.skridt() );
  }
}

public class DansMedMig {
  public double skridt() {
    return 1.0;
  }
}
Avatar billede Slettet bruger
23. august 2003 - 01:39 #2
Du kan godt have begge klasser i samme fil. Der må dog kun være en public klasse i én fil. Dvs. du skal fjerne public foran din klasse dansmedmig (den har så det man kalder package el. friendly access).

Alternativt importerer du dansemedmig fra din dans.java ved at tilføje import dansmedmig; øverst. Det kræver at Java kan finde klassen du vil importere (dansemedmig). Denne skal være i samme directory som dans eller i din CLASSPATH.

Udover import bør du også læse lidt om pakker (packages), der lader dig gruppere klasser i pakker.

http://java.sun.com/docs/books/tutorial/
Avatar billede simonvalter Praktikant
23. august 2003 - 01:39 #3
du kan lige ændre
System.out.println(""+d.skridt);
til
System.out.println(d.skridt());

og så går jeg ud fra at du compiler i commandline (cmd.exe?)
det kan du gøre ved at compile sådan her

javac -classpath . dans.java

begge classer vil blive compilet så.

så kører du den med
java -cp . dans

hvis du bruger et program feks jbuilder vil det gøre det noget nemmere da programmet selv finder ud af det vist ved at compile i baggrunden .. i tidlige versoner skulle man compile de klasser man havde lavet for at kunne bruge metoden i en anden klasse.
Avatar billede bearhugx Nybegynder
23. august 2003 - 01:41 #4
mercur8 >> hvor har du hørt den om at der kun må være én public klasse pr. fil ?
Avatar billede simonvalter Praktikant
23. august 2003 - 01:48 #5
når jeg nævner det med at man skulle compile klassen i tidligere versioner for at bruge en metode taler jeg selvfølgelig om codeinsight .. sad lige og sov ;)
Avatar billede bearhugx Nybegynder
23. august 2003 - 01:49 #6
loadet >> det' ok!, vi nærmer os også de små timer :-)))
Avatar billede Slettet bruger
23. august 2003 - 01:49 #7
bearhugx : Er det forkert da? Det har jeg altid være overbevist om :)

public class Foo {
    public void test() {
        System.out.println("test");
    }
}

public class Bar {
    public static void main(String args[]) {
        Foo f = new Foo();
        f.test();
    }
}

Gemmer jeg denne som Bar.java og forsøger at kompilere får jeg da også:

C:\Java\Bar.java:1: class Foo is public, should be declared in a file named Foo.java
public class Foo {
      ^
1 error
Avatar billede bearhugx Nybegynder
23. august 2003 - 01:52 #8
Hvilken compiler bruger du .. Nogle compilere har det med at alle klasser (uanset accessability) skal deklareres i hver deres fil - andre er ligeglade...

Jikes er en af de compilere, hvor man "opfordres" til at gemme hver klassedekleration i hver deres fil.
Avatar billede Slettet bruger
23. august 2003 - 01:55 #9
j2sdk1.4.2
Avatar billede bearhugx Nybegynder
23. august 2003 - 01:55 #10
som en side-bemærkning vil jeg da også mene at det er fornuftigt at have hver klasse i hver sin fil - hvis der er klasser, som er så tæt forbundene med hinanden at man ikke kunne forestille sig den ene uden den anden, så er der måske mere tale om interne klasser
Avatar billede bearhugx Nybegynder
23. august 2003 - 01:56 #11
dvs. javac
Avatar billede Slettet bruger
23. august 2003 - 01:57 #12
"interne klasser"? Mener du indre klasser?
Avatar billede bearhugx Nybegynder
23. august 2003 - 01:57 #13
yes...
Avatar billede Slettet bruger
23. august 2003 - 02:02 #14
Hvilkere kompilere tillader det så?

I mit eksempel, hvis Foo også kunne være public og havde en main metode. Hvordan ved java så hvilken main metode, der skal kaldes? Udfra filens navn?!
Avatar billede bearhugx Nybegynder
23. august 2003 - 02:07 #15
du kalder jo en class får du starter et program - Java vil lede efter en mainmetode i den...
Avatar billede simonvalter Praktikant
23. august 2003 - 02:09 #16
madslee du har efterhånden en del spørgsmål åbne hvor nogen af dem er meget gamle, hvis du vil være så venlig at gå dem igennem og få lukket nogen af dem er jeg sikker på der er nogen brugere der bliver glade og det er også i din egen interresse.
Avatar billede simonvalter Praktikant
23. august 2003 - 02:11 #17
det har også kun betydning når du skriver javafilen hvor klassen står .. når du compiler får den sin egen class fil
Avatar billede Slettet bruger
23. august 2003 - 02:13 #18
Ok har mig bekendt aldrig været muligt med Sun's kompilere.
Avatar billede Slettet bruger
23. august 2003 - 02:13 #19
Så det er derfra, jeg har det :)
Avatar billede arne_v Ekspert
23. august 2003 - 09:37 #20
Så vidt jeg kan se opfører SUN Javac og Jikes sig helt ens:

C:\>java -version
java version "1.4.1_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)

C:\>jikes -version
Jikes Compiler - Version 1.18 - 21 November 2002
(C) Copyright IBM Corp. 1997, 1998, 1999, 2000, 2001, 2002.
- Licensed Materials - Program Property of IBM - All Rights Reserved.
Originally written by Philippe Charles and David Shields of IBM Research,
Jikes is now maintained and refined by the Jikes Project at:
<http://ibm.com/developerworks/opensource/jikes>
Please consult this URL for more information and for reporting problems.

C:\>type To1.java
public class To1 {
}

public class To1extra {
}

C:\>type To2.java
public class To2 {
}

class To2extra {
}

C:\>javac To1.java
To1.java:4: class To1extra is public, should be declared in a file named To1extr
a.java
public class To1extra {
      ^
1 error

C:\>javac To2.java

C:\>jikes To1.java

Issued 1 semantic warning compiling "C:/To1.java":

    4. public class To1extra {
                    ^------^
*** Semantic Warning: The type "To1extra" is declared public in compilation unit
"C:/To1.java" which also contains the public type, "To1".

C:\>jikes To2.java
Avatar billede arne_v Ekspert
23. august 2003 - 09:44 #21
Det står lidt om det i Java Language Specification:

http://java.sun.com/docs/books/jls/second_edition/html/packages.doc.html#26783

midtfor:

When packages are stored in a file system (§7.2.1), the host system may choose to enforce the restriction that it is a compile-time error if a type is not found in a file under a name composed of the type name plus an extension (such as .java or .jav) if either of the following is true:

    * The type is referred to by code in other compilation units of the package in which the type is declared.
    * The type is declared public (and therefore is potentially accessible from code in other packages).

This restriction implies that there must be at most one such type per compilation unit. This restriction makes it easy for a compiler for the Java programming language or an implementation of the Java virtual machine to find a named class within a package; for example, the source code for a public type wet.sprocket.Toad would be found in a file Toad.java in the directory wet/sprocket, and the corresponding object code would be found in the file Toad.class in the same directory.

When packages are stored in a database (§7.2.2), the host system must not impose such restrictions.

In practice, many programmers choose to put each class or interface type in its own compilation unit, whether or not it is public or is referred to by code in other compilation units. A compile-time error occurs if the name of a top level type appears as the name of any other top level class or interface type declared in the same package (§7.6).

så det er ikke et krav at det skal give en fejl, men SUN ligger op
til at man gør det.
Avatar billede bearhugx Nybegynder
23. august 2003 - 11:23 #22
arne_v >> tak for den opfrisker... Den var ret oplysende... Så havde mercur8 ret - sorry Mercur8 :-)) ...

Selvfølgelig undgår man jo så dette ved at holde hver klasse i hvert sit "compilation unit" :-)
Avatar billede arne_v Ekspert
23. august 2003 - 20:55 #23
Det gør det også lidt nemmere at finde ting.
Avatar billede madslee Nybegynder
23. august 2003 - 21:24 #24
det eneste jeg søger er at hvordan jeg hvis jeg har en
fil..

"boks.java"

public class boks
    {   
        double mads1,mads2,mads3;
        public double area()
        {
        return mads1*mads2*mads3;
        }
    };

og en anden fil
"test.java"
public class test
{
    public static void main(String[] args)
    {
        cb = new boks();
        cb.mads1 = 12.3;
        cb.mads2 = 3.0;
        cb.mads3 = 4.5;
        System.out.println(""+cb.area());
    }

}


'hvordan får jeg test.java til at vide hvad et boks object er  ??? det er jo 2 forskellige filer!
Avatar billede arne_v Ekspert
23. august 2003 - 21:28 #25
De ligger begge i samme package (default) og derfor skal
de bare ligge i samme directory, så finder de hinanden !
Avatar billede bax Nybegynder
26. august 2003 - 11:06 #26
Nogle gange kan det hjælpe med at tilføje f.eks.
package <pakkenavn>   
til både din main klasse og dine under klasser.
feks.

package boksPack
public class boks
    {   
        double mads1,mads2,mads3;
        public double area()
        {
        return mads1*mads2*mads3;
        }
    };

----------------og en anden fil

package boksPack
public class test
{
    public static void main(String[] args)
    {
        cb = new boks();
        cb.mads1 = 12.3;
        cb.mads2 = 3.0;
        cb.mads3 = 4.5;
        System.out.println(""+cb.area());
    }

}

hvilke program bruger du?.... hvis du benytter Oracle 9i, kan du se stien til dine filer ved at holde musen over dine klassenavne i den pågældende projektmappe.
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