Προς το περιεχόμενο

JAVA Abstract Classes και Packages


Axelfc

Προτεινόμενες αναρτήσεις

Δημοσ.

Εστω οτι εχω δυο classes την Α και την Β εκ των οποιων η Α ειναι abstract και η B ειναι η υλοποιηση της. Η Α βρισκεται στο package πχ gr.insomnia.

Στην Α εχω:

 

pacakage gr.insomnia;

 

public abstract class A{

//variables

//methods

}

 

Την κλαση Β σε ποιο φακελο πρεπει να τη βαλω; Στο C:\gr\insomnia η καπου αλλου; Χρειαζεται να ορισω και σε αυτη το ιδιο package;

Εκτος απο το

 

public class B extends A{...}

 

χρειαζεται να κανω καποιο Import; Ευχαριστω προκαταβολικα.

Δημοσ.

Την κλαση Β σε ποιο φακελο πρεπει να τη βαλω; Στο C:\gr\insomnia η καπου αλλου; Χρειαζεται να ορισω και σε αυτη το ιδιο package;

 

Όπου θέλεις' date=' δεν παίζει ρόλο που θα είναι.

 

Εκτος απο το

 

public class B extends A{...}

 

χρειαζεται να κανω καποιο Import; Ευχαριστω προκαταβολικα.

 

Αν η Β είναι σε κάποιο άλλο πακέτο ναι, αν είναι στο ίδιο όχι.

Δημοσ.

Αυτη τη στιγμη εχω τα παρακατω αρχεια:

 

C:\gr\insomnia\Α.java

 

κώδικας:

pacakage gr.insomnia;

 

public abstract class A{

//variables

//methods

}

 

C:\B.java

 

κώδικας:

pacakage gr.insomnia;

public class B extends A{

}

 

Στο Classpath χρειαζεται να ορισω τη θεση καποιων απο αυτα τα δυο;

πχ C:\ ή C:\gr\insomnia

 

Στη συνεχεια πρωτα κανω compile την abstract και στη συνεχεια την κανονικη;

Δοκιμασα και τους δυο φακελους στο classpath και αναφερει οτι δεν μπορει να βρει την abstract.

Δημοσ.

Καταρχήν, όσες κλάσεις (.class αρχεία) είναι δηλωμένες σε κάποιο πακέτο πρέπει να βρίσκονται και στο ανάλογο directory structure! (εν αντιθέσει με τα .java αρχεία που είναι τα source και που δεν είναι απαραίτητο)

 

Άρα η compiled κλάση B (B.class) στην προκειμένη περίπτωση, πρέπει επίσης να είναι στο C:\gr\insomnia\ μαζί με το αρχείο A.class

 

Compile στην ουσία πρέπει να κάνεις πρώτα την κλάση A και μετά την B γιατί στην ουσία η B έχει αναφορά στην A άρα αν το κάνεις ανάποδα, απλά η Α δε θα βρίσκει την Β! :)

Δημοσ.

Κατα λαθος εγραψα τα αρχεια με καταληξη class στο προηγουμενο post μου. :oops: Τωρα το διορθωσα. To A.java το κανω κανονικα compile. Οταν παω ομως να κανω compile το Β.java το οποιο βρισκεται στο C:\ μου βγαζει οτι δεν μπορει να βρει την A, ενω την εχω κανει απο πριν compile. Γι'αυτο ρωταω αν πρεπει να γραψω κατι στο classpath για να την εντοπιζει ο compiler. Αυτα που δοκιμασα δεν επιασαν... Επισης δοκιμασα τον παρακατω κωδικα για το B.java

 

import gr.insomnia.*;

class B extends A {

}

 

αλλα και παλι δεν βρισκει την A.

Δημοσ.

Όπως είπε και ο Γηρυόνης

 

Εκτος απο το

 

public class B extends A{...}

 

χρειαζεται να κανω καποιο Import; Ευχαριστω προκαταβολικα.

 

Αν η Β είναι σε κάποιο άλλο πακέτο ναι' date=' αν είναι στο ίδιο όχι.[/quote']

 

Συνεπώς δε χρειάζεται το ιmport!

 

Και όπως είπα και εγώ

Καταρχήν' date=' όσες κλάσεις (.class αρχεία) είναι δηλωμένες σε κάποιο πακέτο πρέπει να βρίσκονται και στο ανάλογο directory structure

[/quote']

:)

 

Άρα βάλε το αρχείο B.java στο C:\gr\insomnia\ και κάντο compile

Δημοσ.

Εβαλα και τα δυο αρχειa Α.java , B.java στο φακελο C:\gr\insomnia\ οπως ειπατε. Κανω compile το A.java, οκ. Και παλι ομως οταν παω να κανω compile το B.java μου βγαζει cannot find symbol A class...

Δημοσ.

Το compile πρέπει να το κάνεις από το root του directory structure όπως είναι δηλωμένο σαν πακέτο.

Πήγαινε στο C:\ και δώσε

 

>
javac gr\insomnia\B.java

Δημοσ.

Εκτός από αυτό που λέει ο Cue μπορείς να κάνεις και το άλλο. Αν υποθέσουμε ότι και τα δύο αρχεία (A.java και B.java) βρίσκονται στο C: μπορείς να κάνεις

 

javac A.java -d .

 

και αν έχεις ήδη θέσει το classpath

 

javac -classpath %CLASSPATH%. B.java

Δημοσ.

Και παλι δεν λειτουργησε τιποτα απο τα δυο που μου ειπατε. Thanks για τη βοηθεια παντως. θα το ψαξω μπας και βγαλω ακρη...

Δημοσ.

Εχουμε και λεμε

 

Είμαστε στο C:\

Εχουμε τα C:\gr\insomnia\Α.java,C:\gr\insomnia\B.java

 

Τα εξής δικαιολογημένα και σωστά λειτουργούνε:

 

javac gr/insomnia/A.java

javac gr/insomnia/B.java

 

ή(το javac είναι αρκετά έξυπνο ώστε να μην ενοχλείται απο αυτά)

 

javac gr\insomnia\A.java

javac gr\insomnia\B.java

 

(Συνιστώμενη η πρώτη μορφή μια και είναι OS-independent σύμφωνα με την java και θα βοηθάει να ακολουθείς μία σύμβαση όταν γράφεις και κάνεις compile.)

 

Τώρα ο πιο πιθανός λόγος που δεν παίζει ? Εχεις πειράξει το classpath ως μεταβλητή. Γενικώς είναι κακή ιδέα να το κάνεις αυτό(μιλάω εκ πείρας) κυρίως γιατι ξεχνάς να θέσεις μέσα πράγματα όπως paths άλλων projects , current(.) κτλ και μετά πάντα κάτι δεν παίζει.

Σημειωτέον απο την στιγμή που θα αλλάξεις μία μεταβλητή απο το System πρέπει να κάνεις restart το cmd ώστε να την δεί. Εάν κάνεις την αλλαγή μέσα απο το ίδιο το cmd προφανώς δεν χρειάζεται αλλά η αλλαγή θα ισχύει μόνο για εκείνη την εκτέλεση του cmd στην οποία έχεις αλλάξει την μεταβλητή

Δημοσ.

Και παλι cannot find symbol class A βγαζει με αυτα που μου ειπες ancalagon. Χρησιμοποιω win98 και στο autoexec.bat στο classpath εχω ορισει μονο το current directory δλδ

SET CLASSPATH="."

Οποιαδηποτε αλλαγη στο autoexec.bat μπορει να γινει δεκτη απο το συστημα με την εντολη c:\autoexec.bat σε Command Prompt. Παιζει καποιο ρολο που ειναι abstract η κλαση Α; Δεν το νομιζω. Και στα δυο αρχεια εχω στην αρχη το ιδιο

package gr.insomnia;

Δημοσ.

Πες μας λίγο

 

1) Πού είναι A.java και B.java αρχεία (πες μας όλο το path)

2) Τί σου βγάζει όταν κάνεις set CLASSPATH

3) Ποιο είναι το package και στα δύο αρχεία

4) Τί μήνυμα λάθους σου βγάζει;

Δημοσ.

Λοιπον εχουμε και λεμε:

Χαριν ευκολιας αντικατεστησα τα ονοματα των αρχειων και τα packages με τα Α.java , B.java , gr.insomnia.

Στην πραγματικοτητα οριστε τι εχω:

 

C:\gr\auth\ee\dsproject\a1\Α1Sparse.java

 

το οποιο εχει τον κωδικα:

 

package gr.auth.ee.dsproject.a1;

public abstract class A1Sparse{...}

 

και το αρχειο

 

C:\gr\auth\ee\dsproject\a1\Sparse.java

 

το οποιο εχει τον κωδικα:

 

package gr.auth.ee.dsproject.a1;

public class Sparse extends A1Sparse {...}

 

Παραλειπω τα ενδιαμεσα γιατι ειναι παρα πολλα.

Οπως βλεπετε η Α1Sparse.java ειναι μια abstract κλαση τα στοιχεια της οποιας

υλοποιουνται απο την Sparse.java.

 

Στο autoexec.bat εχω ορισει τα εξης (ειπαμε win98, οχι XP):

 

SET PATH="C:\Program Files\Java\jdk1.5.0\bin"

SET CLASSPATH="."

 

Επειτα απο Command Prompt πηγαινω στο φακελο C:\gr\auth\ee\dsproject\a1

και εκτελω: javac A1Sparse.java

Δημιουργειται σωστα η A1Sparse.class

 

Στη συνεχεια εκτελω: javac Sparse.java

και παιρνω το παρακατω μηνυμα λαθους:

 

C:\gr\auth\ee\dsproject\a1>javac Sparse.java

Sparse.java:6: cannot find symbol

symbol: class A1Sparse

public class Sparse extends A1Sparse {

 

με ενα βελακι να δειχνει στο A1Sparse.

 

Δοκιμασα και απο το C:\ να εκτελεσω

javac gr\auth\ee\dsproject\a1\Sparse.java

αλλα και παλι πηρα το ιδιο μηνυμα λαθους.

Δημοσ.

Να ρωτήσω κάτι σχετικό/άσχετο?

Γιατί δε χρησιμοποιείς κάποιο IDE για το development?

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...