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

Java FAQ


apoc

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

Συνεχιζοντας την προσπαθεια που εχουμε αρχησει εδώ και ενα 1-2 μηνες εμεις οι Java Funs προσθετουμε ακομα ενα μικρο κειμενο σαν μια συντομη εισαγωγη στουσ βασικούς τυπους δεδομένων στην Java.Ο σκοπος του κειμενου ειναι να δώσει μια πρωτη γευση ακομα και στον πιο αδαή (τουλαχιστον προσπαθει <img border="0" title="" alt="[smile]" src="images/icons/smile.gif" /> )

Επισης το group μας απεκτησαι τα πρωτα του μέλη ελπιζουμε η παρεα μας να μεγαλώσει

 

Το παρακατω κειμενο σε html format μπορειτε να το βρειτε και εδώ αν θελετε να το δειτε πιο καλά..μαλλον καποια html tables δεν θα βγουν σωστα

 

http://members.tripod.com/apoc_gr/JavaInsomniacsDocs/JavaPrimitiveDataTypes.htm

 

Τύποι δεδομένων στην Java

 

 

Ένας από τους λόγους που η Java θεωρητικά δεν είναι μια 100% αντικειμενοστραφής γλώσσα είναι η παρουσία και σε αυτήν, των λεγόμενων αρχέγονων τύπων δεδομένων (primitive data types ή build-in data types) .Όταν μιλάμε για αρχέγονους τύπους δεδομένων εννοούμε τους γνωστούς μας ακεραιους, δεκαδικους, χαρακτηρες και byte και κάθε ένας από αυτούς χρησιμοποιείται για να αποθηκεύσουμε στη μνήμη μια αλφαριθμητική τιμή, αλλά για να τους χρησιμοποιήσουμε δεν χρειάζεται η δημιουργία κάποιου object μέσω αντιστοίχου class κατασκευαστή (constructor). Αλλά ας ξεκινήσουμε με τα βασικά! Η παρακάτω παράγραφος περιληπτικά δίνει την εικόνα των bit και byte (γνωστά και ως οκτάδες octets) για όσους δεν έχουν προηγούμενη εμπειρία!

 

 

 

Bits και bytes

 

 

Όπως όλοι ξέρουμε τα μοναδικά πράγματα τα οποία καταλαβαίνει ο επεξεργαστής του υπολογιστή μας είναι το 0 και το 1. Ο,τιδήποτε κάνουμε, δημιουργούμε ή αποθηκεύουμε στον υπολογιστή μας καταλήγει σε μεγάλες αλληλουχίες 0 και 1 τις οποίες και επεξεργαστής διαχειρίζεται. Τι είναι το bit και τι το byte;

 

 

 

Φανταστείτε το bit σαν την ελάχιστη οντότητα πληροφορίας που μπορεί να διαχειριστεί ο υπολογιστής. Το bit μπορεί να πάρει μόνο μια τιμή και αύτη η τιμή μπορεί να είναι το 0 ή το 1.

 

 

 

Το byte αντίστοιχα αποτελείται από 8 bit (εξ ου και η ονομασία οκτάδα). Μια αλληλουχία 8 bit τα οποία μπορούν όπως είπαμε να έχουν την τιμή 0 η 1. Παρακατω δίνω ένα σχηματικό παράδειγμα του byte.

 

 

 

Byte

 

0 - bit 8

0 - bit 7

1 - bit 6

0 - bit 5

1 - bit 4

0 - bit 3

0 - bit 2

1 - bit 1

 

 

 

Βλέπουμε λοιπόν το byte έχει 8 bit από τα οποία μερικά έχουν την τιμή ένα και αλλά την τιμή μηδέν. Δεν πρέπει να ξεχνάμε ότι ο υπολογιστής καταλαβαίνει μόνο το δυαδικό σύστημα. Και ότι η κάθε ενέργεια μας μεταφράζεται σε αλληλουχίες αριθμών του δυαδικού συστήματος!

 

 

 

Βασικοί τύποι στην Java

 

 

Η Java υποστηρίζει όλους τους βασικούς τύπους που μπορούμε να συναντήσουμε και σε άλλες γλώσσες και έχει το προνόμιο ότι οι βασικοί τις τύποι είναι συμβατοί και έχουν την ίδια χωρητικότητα πληροφορίας ανεξάρτητα ποια πλατφόρμα υπολογιστή χρησιμοποιούμε, αρκεί το εν λόγω σύστημα να έχει υποστήριξη Java (ανάλογο virtual machine)! Οι χρηστές της C και C++ πολλές φορές ήταν υποχρεωμένοι να γράφουν κομμάτια του κώδικα τους για προγράμματα που ήθελαν να τρέχουν σε πλατφόρμες, αυτό γιατί σε κάθε τέτοια πλατφόρμα οι τύποι δεδομένων κατέχουν διαφορετική ποσότητα μνήμης. Παραδείγματος χάρη μπορούσε στην Α πλατφόρμα ο τύπος του ακέραιου να κατείχε 8 byte μνήμης ενώ στην B πλατφόρμα 4 byte μνήμης. Ας δούμε με περισσότεροι λεπτομέρεια όλους τους αρχέγονους τύπους στον παρακάτω πίνακα.

 

Πρέπει να τονίσουμε σε αυτό το σημείο ότι οι βασικοί τύποι στην Java είναι signed δηλαδή, περιέχουν μέσα στην δομή τους και την πληροφορία για το πρόσημο τους. Αυτή η πληροφορία βρίσκεται στο πιο αριστερό bit της τιμής της μεταβλητής. Ένα απλό παράδειγα ο τύπος byte στη Java μπορεί να αποθηκεύσει πληροφορία 8 bit (βλέπε πάνω σχήμα), η τιμή του (bit 8) δηλώνει αν η μεταβλητή περιέχει έναν θετικό η αρνητικό αριθμό.

 

 

 

Πχ η τιμή 6 μεταβλητής τύπου (byte) αναπαρίσταται για τον υπολογιστή μας έτσι

 

 

 

0 - bit 8

0 - bit 7

0 - bit 6

0 - bit 5

0 - bit 4

1 - bit 3

1 - bit 2

0 - bit 1

 

 

Η τιμή όμως (-6) της μεταβλητής τύπου (byte) αναπαρίσταται για τον υπολογιστή μας

 

 

 

1 - bit 8

0 - bit 7

0 - bit 6

0 - bit 5

0 - bit 4

1 - bit 3

1 - bit 2

0 - bit 1

 

 

 

To πιο αριστερό bit 8 που δηλώνει το πρόσημο στην περίπτωση του -6 έχει την τιμή 1 και δηλώνει την ύπαρξη αρνητικού πρόσημου.

 

Γιαυτό το λόγο θα παρατηρήσουμε ότι σε έναν τύπο η μέγιστη αρνητική τιμή είναι κατά ένα πιο μεγάλη αριθμητικά από την μέγιστη θετική τιμη. Δείτε το πεδίο τιμών του τύπου byte .

 

 

 

Πίνακας 1

 

 

 

Τύπος

Μέγεθος σε bit

Πεδίο τιμών

 

boolean

8

true ή false

 

byte

8

-128 έως +127

 

char

16

\u0000 έως \uFFFF

 

short

16

-32,768 έως 32,767

 

int

32

-2,147,483,648 έως +2,147,483,647

 

long

64

-(2^63) έως +(2^63)+1

 

float

32

-3.4028234663852886E+38 έως

 

-1.40129846432481707e-45

 

double

64

Αρνητικές τιμές

 

-1.79769313482623157Ε+308 έως -4.94065645841246544e-324

 

 

 

Θετικές τιμές

 

4.94065645841246544e-324

 

έως

 

1.79769313482623157Ε+308

 

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

 

Πως θέτουμε και χρησιμοποιούμε μεταβλητές αρχέγονων τύπων (declaring primitive type variables)

 

 

Εδώ θα χρησιμοποιήσουμε μια νέα κλάση που θα την ονομάσουμε aSimpleClass. Η συγκεκριμένη κλάση δεν έχει main μέθοδο άρα δεν θεωρείται Java εφαρμογή! Παρόλα αυτά μπορούμε να διακρίνουμε την δήλωση σε επίπεδο κλάσης διάφορων μεταβλητών αλλά και τη δήλωση διάφορων μεθόδων οι οποίες παίρνουν ως όρισμα αντίστοιχα ορισμένες μεταβλητές. Ας τα δούμε με περισσότερη λεπτομέρεια! Μετά τη δήλωση της κλάση μας (aSimpleClass) ακολουθούν 7 δηλώσεις διάφορων μεταβλητών. Ο τρόπος της δήλωσης είναι συγκεκριμένος και πρέπει να ακολουθεί κάποιους κανόνες. Πρώτα πρέπει πάντα τα δηλώνουμε τον τύπο της μεταβλητής (int, long κτλ), στη συνεχεία ένα όνομα και μετά αν θέλουμε μπορούμε να της δώσουμε και μια τιμή! Όπως είπα αν θέλουμε μπορούμε να της δώσουμε τιμή γιατί όπως βλέπουμε στις δηλώσεις μας στην παρακάτω κλάση έχουμε δηλώσει ορισμένες μεταβλητές χωρίς να τις έχουμε δώσει κάποια αρχική τιμή (variables not initialized).

 

 

 

Ένα άλλο χαρακτηριστικό στις παρακάτω 6 δηλώσεις των μεταβλητών αυτών είναι ότι είναι δηλωμένες στο λεγόμενο επίπεδο της κλάσης. Δηλαδή είναι ορατές και προσβάσιμες σε κάθε μέθοδο της κλάσης αλλά και άλλων κλάσεων ανάλογα με τη δημοσιότητα που της έχουμε δώσει στην δήλωση μας. Τι εννοούμε με τον όρο δημοσιότητα όπως έχουμε αναφέρει και σε προηγούμενο κείμενο μια κλάση, μια μέθοδος αλλά και ακόμα μια μεταβλητή μπορεί να χαρακτηριστεί κατά την δήλωση της για το αν θα φαίνεται στον έξω κόσμο που χρησιμοποιεί την κλάση, αν θα φαίνεται σε άλλες κλάσεις που χρησιμοποιούν την κλάση αυτή αλλά και ποια μέρη της θα είναι ορατά! Στη συγκεκριμένη περίπτωση όλες οι μεταβλητές (εκτός μίας) που έχουμε δηλώσει έχουν χαρακτηριστεί ως public (δημόσιες) άρα κάθε ένας που χρησιμοποιεί ένα αντικείμενο της κλάσης aSimpleClass θα μπορεί να χρησιμοποιεί της μεταβλητές αυτές! Αντίθετα η μεταβλητή με όνομα anPrivateInt έχει χαρακτηριστεί private και δεν θα είναι ορατή σε άλλες κλάσεις που χρησιμοποιούν το παράδειγμα μας, πάντως δεν παύει να είναι διαθέσιμη σε όλες τις μεθόδους της κλάσης μας.

 

 

 

Ένα πολύ σημαντικό σημείο που πρέπει να τονιστεί εδώ είναι το εξής. Στην Java (και όχι μόνο) ΑΠΑΓΟΡΕΥΕΤΑΙ να χρησιμοποιήσεις μεταβλητή προτού της έχεις δώσει αρχική τιμή, δειτε το παρακάτω μικρό παράδειγμα μια μεθόδου

 

public int myMeth ()

 

{

 

int anInt; //δήλωση μεταβλητής με όνομα anInt της οποίας δεν δίνεται αρχική τιμή.

 

int anInt2=5; //δήλωση μεταβλητής με όνομα anInt2 ,δίνεται αρχική τιμή 5.

 

int result; //δήλωση μεταβλητής με όνομα result της οποίας δεν δίνεται αρχική τιμή.

 

 

 

//προσθέτουμε τις μεταβλητές anInt ,anInt2 και δίνουμε αρχική τιμή στην μεταβλητή result

 

result = anInt +anInt2 ;

 

 

 

return result;

 

}

 

 

 

 

 

Ο compiler με το που επιχειρήσουμε να κάνουμε compile την παραπάνω μέθοδο μέσα σε κάποια κλάση θα παραπονεθεί έντονα γιατί προσπαθούμε στον κώδικα μας να χρησιμοποιήσουμε την μεταβλητή anInt ενώ δεν της έχουμε δώσει κάποια αρχική τιμή!

 

 

 

Συνεχίζοντας στην περιπλάνηση μας μέσα στην κλάση (aSimpleClass) βλέπουμε μετά τη δήλωση των μεταβλητών επιπέδου κλάσης (ή instance variables ή class variables) ακολουθούν 2 δηλώσεις μεθόδων. Η πρώτη (Ameth) δέχεται ως παράμετρο έναν ακέραιο στην συνεχεία τον μετατρέπει σε long (μεγάλος ακέραιος) και τον επιστρέφει. Ο σκοπός αυτής της μεθόδου είναι να μας δείξει πως μπορούμε να κάνουμε αλλαγές στον τύπο μια μεταβλητής. Στη συγκεκριμένη μέθοδο αφού θέλαμε να επιστρέψουμε μια τιμή τύπου long και η παράμετρος μας ήταν τύπου int έπρεπε να βρούμε τρόπο να αλλάξουμε τον τύπο της μεταβλητής σε αυτόν που όριζε η μέθοδος. Η διαδικασία αυτή ονομάζεται type-casting (= αλλαγή ή μασκάρεμα τύπου). Όπως βλέπουμε στην μέθοδο αυτό μπορούμε να το πετύχουμε με το να προσθέσουμε μέσα σε παρένθεση τον τύπο που θέλουμε η αλλαγή να γίνει. ακόμα πιο προσεκτικά βλέπουμε ότι η μέθοδος στην πρώτη γραμμή της δηλώνει μια μεταβλητή του τύπου (long) και της δίνει αμέσως την τιμή της παραμέτρου αφού όμως πρώτα την μετατρέψει στον ίδιο τύπο. Σε αυτό το σημείο πρέπει να πούμε ότι πρέπει να είμαστε πολύ προσεκτικοί γιατί, είναι λογικό δεν μπορούμε να κάνουμε αλλαγές (type-casting) από οποιονδήποτε τύπο σε οποιονδήποτε άλλο τύπο. Το γιατί θα μας το δείξει το ο πίνακας 1.

 

 

 

Παρατηρούμε ότι ο κάθε τύπος μεταβλητής μπορεί να κρατήσει να αποθήκευση ορισμένη ποσότητα πληροφορίας. Όταν παραδείγματος χάρη δηλώνουμε μια μεταβλητή με τύπο (int) ξέρουμε από την αρχή ότι η μεταβλητή μας μπορεί να έχει τιμές από -2,147,483,648 έως +2,147,483,647 ούτε παραπάνω ούτε παρακάτω ή αντίστοιχα μια μεταβλητή του τύπου byte μπορεί να πάρει τιμές -128 έως 127. Αν προσπαθήσουμε εμείς να δώσουμε σε μια μεταβλητή τύπου byte την τιμή 345 τότε έχουμε χάσει πολύτιμη πληροφορία γιατί ο υπολογιστή μας έχει δεσμεύσει μνήμη μόνο για συγκεκριμένο εύρος τιμών και όχι παραπάνω. Με την ίδια λογική δεν μπορώ και δεν είναι σωστό να προσπαθήσω να αλλάξω τον τύπο μια μεταβλητής τύπου int σε byte γιατί είναι σχεδόν σίγουρο ότι θα χάσω μέρος της πληροφορίας που κρατάει η μεταβλητή. ένας μικρός γενικός κανόνας είναι ότι δεν επιχειρούμε σχεδόν ποτέ (type-cast) από τύπο με μεγάλη ποσότητα πληροφορίας σε τύπο με μικρότερη ποσότητα πληροφορίας γιατί είναι πολύ πιθανό να χάσουμε μέρος της πληροφορίας.

 

 

 

Στην επόμενη μέθοδο με όνομα (anotherMeth) ορίζουμε μια μεταβλητή τύπου char (χαρακτήρα) σαν παράμετρο, τοπικά μέσα στην μέθοδο δηλώνουμε και δίνουμε αρχική τιμή σε μια άλλη μεταβλητή με όνομα (aChar2)και δίνουμε και αρχική τιμή τον χαρακτήρα (e). Πρέπει να τονίσουμε ότι η μεταβλητή (char2) έχει ζωή μόνο μέσα στα όρια της μεθόδου, δεν είναι ορατή από κανέναν απέξω από την μέθοδο και η ζωή της (scope) έρχεται σε τέλος με το που η μέθοδος ολοκληρώσει την δουλεία της και επιστρέψει αποτέλεσμα.

 

 

 

//aSimpleClass.java η κλάση δεν είναι Java application δεν έχει

 

// main μέθοδο

 

 

 

public class aSimpleClass{

 

 

 

public int anInt = 6; //μια δήλωση μεταβλητής ακέραιου

 

 

 

//μια δήλωση μεταβλητής ακέραιου που έχει χαρακτηριστεί private για την κλάση.

 

private int anPrivateInt = 0;

 

 

 

/*

 

μια δήλωση πολλαπλων μεταβλητών (ακέραιοι).

 

Όπως βλέπουμε μπορούμε σε μια γραμμή να δηλώσουμε πολλαπλές

 

μεταβλητές αρκεί να είναι του ίδιου τύπου

 

*/

 

public int aSecInt, aThirdInt;

 

 

 

public boolean aBoolean; //δήλωση μεταβλητής τύπου boolean

 

public char aChar; //δήλωση μεταβλητής τύπου char (χαρακτήρας)

 

public char aChar2 =r; //δήλωση μεταβλητής char όπου δίνεται και η αρχική τιμή r

 

public long aLong; //δήλωση μεταβλητής τύπου long

 

 

 

 

 

/*

 

Μια δήλωση μεθόδου που δέχεται σαν παράμετρο έναν

 

Ακέραιο(anInt) και επιστρέφει έναν ακέραιο συγκεκριμένα τον Αριθμό 5.

 

*/

 

public long Ameth(int anInt)

 

{

 

long anotherLong = (long) anInt;

 

return anotherLong;

 

 

 

}//end of method Ameth

 

 

 

 

 

/**

 

*μέθοδος anotherMeth,δεχεται σαν παράμετρο μια μεταβλητή τύπου χαρακτήρα.

 

*δηλώνει και ενεργοποιεί με την τιμή 'e' μια ακόμα μεταβλητή τύπου χαρακτήρα

 

*Στην συνεχεία δίνει στην παράμετρο aCharParam την τιμή της τοπικής μεταβλητής aChar2 και

 

*την επιστρέφει

 

*/

 

public char anotherMeth(char aCharParam)

 

{

 

char aChar2 ='e'; //δήλωση και αρχικοποίηση τιμής σε μεταβλητή τύπου char.

 

 

 

//θέτουμε την τιμή της παραμέτρου ίση με την τιμή της τοπικής στην μέθοδο μεταβλητή

 

aCharParam = aChar2;

 

 

 

//επιστρέφουμε τον χαρακτήρα που θα έχει την τιμή e

 

return aCharParam;

 

 

 

}//end of method

 

 

 

public boolean aBoolMeth(boolean aBoolean)

 

{

 

//δήλωση και αρχικοποίηση τιμής σε μεταβλητή τύπου boolean

 

boolean aBoolean2 = false;

 

 

 

//θέτουμε την τιμή στην παράμετρο aBoolean

 

aBoolean = true;

 

 

 

//επιστρέφουμε την τιμή true (boolean) όπως ορίζει η δήλωση

 

return true;

 

}

 

}//end of aSimpleClass class

 

 

 

 

 

 

 

Να μην ξεχάσουμε να αναφέρουμε τον ιδιαίτερο χαρακτήρα των μεταβλητών τύπου boolean που δεν έχουν αλφαριθμητικό χαρακτήρα και περιορίζονται μόνο στις τιμές true ή false, είναι γνωστές και σαν flags (σημαίες σε ελεύθερη μετάφραση). Βλέπε μέθοδο (aBoolMeth).

 

 

 

Πριν το τέλος

Το παραπάνω κείμενο είναι λογικό να μην καλύπτει 100% όλο το θέμα των βασικών τύπων στην Java.O σκοπός του είναι να αποκτήσουν οι αναγνώστες μια πρώτη επαφή με την διαχείριση και χρησιμοποίηση μεταβλητών αλλά και να κατανοήσουν σε αρχικό στάδιο την έννοια του τύπου και της πληροφορίας. Για αυτή την πρώτη επαφή δεν πρέπει να ξεχάσουμε τα εξής:

 

Για την καλύτερη και πιο σωστή διαχείριση μεταβλητών στα προγράμματά μας είναι καλό να έχουμε της πληροφορίες του πίνακα 1 όπου θα μπορούμε εύκολα και γρήγορα να διαλέγουμε ποιος τύπος μεταβλητής είναι πιο σωστός και χρήσιμος για κάθε ενδεχόμενο

ΠΟΤΕ δεν προσπαθούμε να χρησιμοποιήσουμε μεταβλητή πρωτού της έχουμε δώσει αρχική τιμή

είμαστε πάντα προσεκτικοί σε κάθε προσπάθεια που κάνουμε να αλλάζουμε τον τύπο της μεταβλητής ανάλογα με τις ανάγκες μας, γιατί υπάρχει κίνδυνος να χάσουμε ποσότητα πληροφορίας κατά την διάρκεια της αλλαγής. Ο πίνακας 1 είναι ένας καλός τρόπος και οδηγός για όσους δεν είναι απόλυτα σίγουροι!

 

 

 

 

Αποστολόπουλος Πάρις (apoc),ΠΚ(Γηριονης)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 251
  • Δημ.
  • Τελ. απάντηση

Ακομα ενα κειμενο που μιλαει γαι το

 

Πως η Εικονική Μηχανή Java φορτώνει και τρέχει τις κλάσεις.

 

θα το βρειτε επισης εδω

http://www.members.tripod.com/apoc_gr/JavaInsomniacsDocs/JavaClassLoaders.doc

 

Πως η Εικονική Μηχανή Java φορτώνει και τρέχει τις κλάσεις.

 

Μία Java εφαρμογή μπορεί να αποτελείται από μόνο μία ή πολλές κλάσεις. Αυτές οι κλάσεις φορτώνοντε δυναμικώς, εν ώρα εκτέλεσης της εφαρμογής, όταν η κλάση που ήδη τρέχει αναφέρετε σε αυτές με το όνομά τους. Όλη αυτή η διαδικασία φόρτωσης των κλάσεων γίνεται από τον εκάστοτε Φορτωτή Κλάσεων (Class Loader). Οι φορτωτές κλάσεων είναι και οι ίδιοι κλάσεις γραμμένες σε Java και η δουλειά τους είναι να φορτώνουνε τo bytecode των κλάσεων στην εικονική μηχανή. Χωρίς αυτούς καμία εφαρμογή δεν μπορεί να τρέξει. Μαζί με την κάθε κλάση φορτώνοντε και οι υπερκλάσεις (super classes), οι διεπαφές (interfaces) και ο,τιδήποτε άλλο πάνω στο οποίο βασίζεται η κάθε κλάση.

 

Ωστόσο εδώ υπάρχει ένα πρόβλημα. Οι ίδιοι οι class loaders είναι γραμμένοι σε Java (και αποτελούντε από bytecode), χωρίς αυτούς δεν μπορεί να φορτωθεί και να τρέξει καμία άλλη κλάση και κατ επέκταση ούτε και οι ίδιοι! Από τη στιγμή που οι class loaders είναι γραμμένοι σε Java τότε εσχάτως όλοι επεκτείνουνε τη java.lang.Object κλάση (όλες οι Java κλάσεις επεκτείνουνε αυτονόητα τη java.lang.Object). Οπότε κανένας class loader δεν μπορεί να τρέξει αν δε φορτωθούν πλήρως όλες οι υπερκλάσεις του οι οποίες όμως βασίζοντε στον class loader για να φορτωθούνε!

 

Η λύση είναι φυσικά ότι υπάρχει ένας class loader (που ονομάζεται bootstrap) που αποτελεί τμήμα αυτής καθεαυτής της εικονικής μηχανής και είναι γραμμένος στη γλώσσα που είναι γραμμένη και η εικονική μηχανή. Όταν ο χρήστης χρησιμοποιεί τη java εντολή για να τρέξει ένα πρόγραμμα τότε ο bootstrap φορτώνει τους άλλους class loaders, οι οποίοι με τη σειρά τους προσπαθούνε να φορτώσουνε την κλάση που ακολουθεί και ψάχνουνε να βρούνε τη main μέθοδο.

 

Υπάρχουνε διάφοροι class loaders (μπορούμε να γράψουμε και τους δικούς μας αν το επιθυμούμε) και ο καθένας φορτώνει συγκεκριμένες κλάσεις. Για παράδειγμα άλλος είναι ο class loader που φορτώνει τις κλάσεις που βρίσκοντε στο classpath και άλλος αυτός που φορτώνει τις Applets.

 

Όπως καταλαβαίνουμε υπάρχει μία ιεραρχία και στους class loaders, ένα «δέντρο» που η ρίζα του είναι ο πρωτογενής class loader (bootstrap) και διακλαδώνεται και σε άλλους. Ο αρχικός class loader φορτώνει κάποιους άλλους και αυτοί με τη σειρά τους φορτώνουνε άλλους κ.ό.κ. Ο πατέρας όλων των class loaders είναι ο bootstrap class loader (ο οποίος φορτώνει τις κλάσεις από το runtime API, δηλαδή το rt.jar) και μετά είναι ο ExtClassLoader (ο οποίος φορτώνει τις κλάσεις από τον /ext υποκατάλογο), μετά έρχεται ο AppClassLoader (φορτώνει τις κλάσεις από το classpath) κ.ό.κ.

 

Όταν μία κλάση (ας πούμε class A) φορτωθεί από έναν class loader τότε αυτή η κλάση ρωτάει τον ίδιο class loader να φορτώσει και όλες τις εξαρτόμενες κλάσεις (δηλαδή όλες οι κλάσεις που εξαρτούντε από την A). Ο class loader με τη σειρά του πάντα αποστέλνει μήνυμα προς τα πάνω, στο δέντρο των class loaders, για να δει αν κάποιος «γονέας» class loader θέλει να φορτώσει την κλάση πρώτα. Αν κανένας γονέας class loader δεν μπορεί να φορτώσει την κλάση τότε τη φορτώνει ο αρχικός class loader.

 

Πότε όμως φορτώνοντε οι κλάσεις; Σε ακριβώς δύο περιπτώσεις: όταν η λέξη-κλειδί new χρησιμοποιείται (String s = new String(hello)) και όταν το bytecode κάνει μία στατική αναφορά σε μία κλάση (Class.forName ή System.out). Όταν η εικονική μηχανή ανταμώσει ένα από τα παραπάνω, τότε ο σχετικός class loader θα αναλάβει να φορτώσει την κλάση χρησιμοποιώντας τον κώδικα ClassLoader.loadClass(String className, boolean resolveIt). To classname είναι το όνομα της κλάσης ενώ το resolveIt χρησιμοποιείται για να δείξει αν η κλάση πρέπει να επιλυθεί ή όχι. Μπορούμε να σκεφτούμε την επίλυση μίας κλάσης ώς τη διαδικασία φόρτωσής της για να τρέξει (δηλαδή φόρτωση και όλων των από αυτή εξαρτόμενων κλάσεων). Μία κλάση που δεν πρέπει να επιλυθεί μπορεί απλώς να φορτωθεί στη μνήμη μόνο και μόνο για να δούμε αν υπάρχει ή για να βρούμε την υπερκλάση της για παράδειγμα.

 

ΠΚ (Γηριόνης)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Mpainw apo Linux gi' ayto grafw greeklish.

 

Elpizw to keimeno na mhn einai poly proxwrhmeno kai na einai katanohto apo oloys, idiaitera apo aytoys poy twra arxizoyne na ma8ainoyne Java. An exete o,tidhpote aporeies kataxwrhste tes kai 8a prospa8hsoyme na to ejhghsoyme kalytera.

 

Eyxaristw to filo apoc gia th boh8eia toy :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

Kala kai oraia opos ta lete re paidia, alla pisteuo oti prepei na kanete mia anafora sta stylistic convesion sas, mias kai den einai according to the style that java Developers use.

 

:-)

 

Xoris na snobaro tin kali prospatheia sas, kano add ena attribure sto olo skiniko.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι έχεις δίκαιο σε αυτό. Σε μερικά παραδείγματα χρησιμοποιούμε μικρά για ονόματα κλάσεων και κεφαλαία για ονόματα μεθόδων. Θα διορθωθεί στην επόμενή μας καταχώρηση. Κατά τα άλλα πιστεύω ότι λίγο πολύ είμαστε μέσα στον τρόπο γραφής πηγαίου κώδικα των περισσοτέρων.

 

Σε ευχαριστούμε για τις παρατηρήσεις σου. :-)

 

<small>[ 30-03-2002, 15:52: Το μήνυμα επεξεργάστηκε από: Γηρυόνης ]</small>

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Doste pragma sto lao paidia, mpravo. Loipon elpizo na min sas xalao to "party" me ayti tin erotisi..

 

Se ena applet, theloume na emfanisoume kapoia grafika. H moni methodos pou gnorizo mexri ayti ti stigmi, einai i eksis(me diafores paralages tis):

 

H class einai implements Runnable kai vazo ena thread to opoio me tin voitheia enos loop, allazei me kathorismeno tropo dyo metavlites x,y.

 

Mesa sto loop kaleitai kathe fora i repaint(). Mesa stin paint zografizo mia grammi xrisimopoiontas tis syntetagmenes apo to thread pou allazoun synexos, opote kai i grammi "kineitai". Diladi

 

public void paint(Graphics g)

{

g.drawLine(x,y,x/2,y*2) //leme tora dyo times

}

 

To provlima:

 

H repaint zografizei ksana OLO to parathyro. Thelo, zografizontas tin proti grammi, kai kathos oi syntetagmenes allazoun meso tou thread, oi nees grammes na PROSTITHEDE sto display. Enno xoris tin xrisi tis repaint(sygekrimeni perioxi), alla apla me tin prosthesi tou neou grafikou sto proigoumeno synolo. Tha sikoso ena preview ayto tis klasis pou ennoo.

 

An den thelete to post ayto edo, pm me na to valo ksexoristo topic.

 

Thanks , perimeno!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Den mporw na dw thn Applet soy. Isws epeidh o browser poy xrhsimopoiw einai akoma se beta ekdosh. Otan mpw apo Windows 8a to ksanakoitaksw.

 

Pros to parwn ayto poy 8elw na so ypow einai oti h repaint 8a ksanabapsei olo to grafiko para8yro poy exeis orisei. An 8eleis na bapseis sygkekrimeno mono meros toy grafikoy para8yroy 8a prpeei na xrhsimopoihseis mia overiden repaint me8odo me tis katallhles parametroys. Isws na se boh8oyse kalytera an xrhsimoppoihseis th

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void repaint(int x, int y, int width, int height)[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">h opoia bafei ena sygkekrimeno tetragwno toy grafikoy soy kai oxi olo to para8yro. x kai y einai oi syntetagmenes ston x kai y aksona (arxizontas apo panw aristera) kai to width & height to platos kai to ypsos antistoixws.

 

Elpizw na boh8hsei.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Katapasa pithanotita ftaiei o browser sou..Ego tin vlepo.

 

Egrapsa oti gnorizo gia tin enallaktiki

repaint(erioxi tou parathyrou)

Se aytin omos tin periptosi den mporo na tin xrisimopoiiso, giati ayto pou thelo na prostheso einai mikres grammes kai oxi kati toso xontrokommeno oso ena orthogonio...Den yparxei kanenas allos tropos?? <img border="0" title="" alt="[Confused]" src="images/icons/confused.gif" />

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Den pisteyw na einai toso xontrokomeno oso les giati kai pali 8a zwgrafisei th grammh alla aplws de 8a kanei repaint olo to grafiko alla mono to tetragwno poy toy ana8eteis esy (to opoio me tis swstes syntetagmenes 8a periexei thn perioxh ths grammhs).

 

Telws pantwn, den mporw na skeftw kati allo. 8a prepei na dw thn Applet na trexei gia na dw ti akribws xreiazetai. Pantws kai olo to grafiko na ginetai repaint den pisteyw na yparxei problhma an mporeseis kai apofygeis to flickering. Ayto ginetai shny8ws an baleis ena delay sth thread soy (synh8ws einai gyrw sta 0.075 sec) prwtoy kaleseis th repaint() me8odo.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1.Η παρατηρηση περι coding conventions ειναι σωστη και αποδεκτή ελπίζουμε στα επομενα κειμενα μας να ειναι προσεγμενα και να συμφωνουν απολυτα με τα Sun Java Coding convetions .

 

2.φιλε inDio open source it χεχεχεχε .Αν εχεις την καλοσυνη δεν μας κανεις μερος η ολο το κωδικα για να μπορεσει ο καθενας να προτεινει κατι...μερικες φορες αν καποιος αλλος δεν ξερει παραγματικα τι συμβαινει και πως εχεις δομησει το Applet σου ,οι απαντησεις θα ειναι λιγο δυσκολο να ειναι ευστοχες...

 

3. το applet το βλεπω και εγω καλά

 

4.Η προσκληση μας για νεα μελη στο JavaInsomniacs club ειναι ακομα ανοικτή ...οσοι πιστευέται οτι εχετε το μερακι την θέληση αλλα και το ενδιαφερον είστε ευπροσδεκτοι....

δεν διεκδικουμε κανενα τιτλο ουτε δασκαλου ,αλλα ουτε φωστηρα με την ολη προσπαθεια απλα μας ενωνει ολους ενα κοινο ενδιαφέρον και πιστη για μια γλωσσα που θεωρουμε τουλαχιστον επαναστατιή (οκ το παρακανα λίγο χεχεχεχ)

 

Να στε καλά

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λύθηκε το πρόβλημα. Απλώς είχες ξεχάσει να βάλεις την update μέθοδο. Απλώς πρόσθεσε τον παρακάτω κώδικα:

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void update(Graphics g)

{

paint(g);

}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Η Applet σου πρώτα καλεί την update και μετά την paint.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

THAAAAAANKS!! douleyei epitelous. To source einai etsi kai allios available, me ton decompiler...Alla tha tha ton anevaso gia opoion thelei.Oriste kai kati allo pou eixa ftiaxei prin ligo kairo...(ama varietai o anthropos..)

 

http://students.ceid.upatras.gr/~panousis/temp/sine.html

kai i istoria me tin xrysi speira na kanei (sxedon) ayto pou thelo..

http://students.ceid.upatras.gr/~panousis/temp/phi.html

 

Perimeno eksigeiseis giati os dia mageias doulepse <img border="0" title="" alt="[big Grin]" src="images/icons/grin.gif" />

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είναι πολύ απλό. Η update έχιε γίνει overriden ώστε να αποτρέπει τον ολικό επανασχεδιασμό του γραφικού. Αντιπαρέρχεται της μεθόδου update από την κλάση Container. Σύμφωνα με την ίδια τη Sun:

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">

update

public void update(Graphics g)

 

Just calls paint(g). This method was overridden to prevent an unnecessary

call to clear the background.

 

Overrides:

update in class Container

Parameters:

g - the specified Graphics window

See Also:

Component.update(Graphics)[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Επίσης να πω ότι την επόμενη φορά που θα υπάρχει πρόβλημα καλό είναι να καταχωρείτε τον κώδικα εξ' αρχής ώστε να μπορούμε να σας βοηθάμε καλύτερα και πιο γρήγορα.

 

Επιπρόσθετη καταχώρηση:

 

Ίνδιο μόλις είδα το προσωπικό σου μήνυμα.

Η update καλέιται πάντα πρώτη από τη repaint και μετά καλείται η paint. Αυτό που κάνει η update είναι να καθαρίζει το φόντο (background) του γραφικού παραθύρου σου. Αυτό γίνεται με το να σχεδιάζει ένα τετράγωνο στις διαστάσεις του παραθύρου πάνω από το ίδιο το παράθυρο. Έτσι καλύπτει την εικόνα που υπήρχε εκεί πρηγουμένως. Τα βήματα που γίνοντε είναι:

 

1) Η εικόνα σχεδιάζεται

2) Το φόντο καθαρίζει

3) Σχεδιάζεται η επόμενη εικόνα.

 

Όπως είπα και πιο πανω έχυομε κάνει την update overriden στην κλάση σου ώστε να μην καθαρίζει το φόντο.Δηλαδή στην κλάση σου οι διεργασίες που γίνοντε είναι οι:

 

1) Η εικόνα σχεδιάζεται

2) Σχεδιάζεται η επόμενη γραμμή

 

Με το που η εικονική μηχανή βλέπει ότι υπάρχει ήδη μία update μέθοδος στην κλάση σου τότε δεν καλεί την update της υπερκλάσης σου, η οποία ξαναζωγραφίζει όλο το γραφικό από την αρχή, αλλά καλεί τη δικιά μας η οποία το μόνο που κάνει είναι να ζωγραφίζει τις γραμμές χωρίς όμως να σβήνει τα προηγούμενα (καλώντας απ' ευθείας την paint).

 

<small>[ 31-03-2002, 18:13: Το μήνυμα επεξεργάστηκε από: Γηρυόνης ]</small>

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

Μετα απο καποιο διαστημα οι JavaInsomniacs ξαναχτυπουν.

Αυτη την φορα νομιζω οτι η προσπαθεια μας διαφερει απο τις προηγουμενες..γιατι στο κειμενο που εχουμε ετοιμασει προσπαθησαμε (και νομιζω το καταφεραμε σε καποιο βαθμο) να μιλησουμε απλοικα για ενα περιπλοκο και συνθετο θεμα του συχρονου κοσμου της πληροφορικης.Δεν ειναι αλλο απο τον αντικειμενοστρεφη προγραμματισμό.

Η Java ειναι μια σχεδον πληρης αντικειμενοστρεφης γλωσσα και διαθετει ολα εκεινα τα χαρακτηριστικα και τις ευκολιες για να μυησεις καποιον αρχαριο στις αντικειμενοστρεφεις τεχνικες προγραμματισμου.

 

Ελπιζουμε να καταφεραμε να δωσουμε μια σωστη και συναμα κατανοητη ιδεα περι του θεματος.Σιγουρα στο κειμενο δεν θα βρειτε ολες τις λεπτομεριες αλλα φροντισαμε περιληπτικα να επικεντρωθουμε στα σημαντικά.

 

Για οποιαδηποτε παρατηρηση η και σχολιο μην διστασετε να κανετε post η να βρειτε μια θεση στο group μας

 

Για λογους format του κειμενου αλλα και ογκου αυτη την φορα δεν προκειται να post-αρουμε το κειμενο εδω αλλα θα δωσουμε το link στο web site στο οποιο υπαρχουν καταχωρημενα ολα τα κειμενα των JavaInsomniacs

 

Το κειμενο με τιτλο JavaOO μπορειτε να το βρειτε εδω

http://members.tripod.com/apoc_gr/JavaInsomniacsDocs/JavaOO.htm

 

Ενω την σελιδα που περιεχει ολα τα κειμενα θα την βρειτε εδω

http://members.tripod.com/apoc_gr/java_insomniacs.htm

 

Να ειστε καλα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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


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