User Tools

Site Tools


java:member_initialization

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:member_initialization [2015/04/20 06:40] – [Final Methods] gthanosjava:member_initialization [2022/02/24 12:39] (current) – external edit 127.0.0.1
Line 14: Line 14:
 </code> </code>
  
-Η παραπάνω μέθοδος αφορά **στατικά** (static) και **μη στατικά** πεδία, προϋποθέτει όμως ότι η ανάθεση της τιμής μπορεί αν γίνει μόνο με μία εντολή (όπως παραπάνω). Πιο σύνθετες μέθοδοι ανάθεσης (π.χ. πρέπει να γίνει αρχικοποίηση ενός πίνακα) μπορούν να γίνουν μέσα στους κατασκευαστές τις κλάσης, μόνο αν μιλάμε για μη στατικά πεδία. Η αρχικοποίηση στατικών πεδίων δεν μπορεί να γίνει μέσα στους κατασκευαστές.+Η παραπάνω μέθοδος αφορά **στατικά** (static) και **μη στατικά** πεδία, προϋποθέτει όμως ότι η ανάθεση της τιμής μπορεί αν γίνει μόνο με μία εντολή (όπως παραπάνω). Πιο σύνθετες μέθοδοι ανάθεσης (π.χ. αρχικοποίηση πινάκων) μπορούν να γίνουν μέσα στους κατασκευαστές τις κλάσης για τα μη στατικά πεδία. Η αρχικοποίηση στατικών πεδίων δεν έχει νόημα να γίνεται μέσα στους κατασκευαστές.
  
-Για την αρχικοποίηση πεδίων εκτός από τους κατασκευαστές έχουμε τις εξής επιλογές:+Για την αρχικοποίηση πεδίων εκτός από τους κατασκευαστές έχουμε τις εξής επιπλέον επιλογές:
   * για στατικά πεδία   * για στατικά πεδία
     * **static initialization blocks**.     * **static initialization blocks**.
Line 28: Line 28:
 ==== Static Initialization Blocks ==== ==== Static Initialization Blocks ====
  
-To //static initialization block// είναι ένα τμήμα κώδικα τοποθετημένο μέσα σε παρενθέσεις { } που προσδιορίζεται από το keyword static, όπως παρακάτω:+To //static initialization block// είναι ένα τμήμα κώδικα τοποθετημένο μέσα σε άγκιστρα { } που προσδιορίζεται από τη λέξη //static//, όπως παρακάτω:
  
 <code java> <code java>
Line 52: Line 52:
 </code> </code>
  
-Το πλεονέκτημα των στατικών μεθόδων είναι ότι μπορούν να επαναχρησιμοποιηθούν σε περίπτωση που χρειαστεί να επανα-αρχικοποιηθεί η στατική μεταβλητή της κλάσης.+<WRAP tip 80% center round> 
 +Το πλεονέκτημα των στατικών μεθόδων είναι ότι μπορούν να επαναχρησιμοποιηθούν σε περίπτωση που χρειαστεί να αρχικοποιηθεί ξανά η στατική μεταβλητή της κλάσης. 
 +</WRAP>
  
 ===== Αρχικοποιώντας μη-στατικά πεδία ===== ===== Αρχικοποιώντας μη-στατικά πεδία =====
Line 58: Line 60:
 ==== Initialization Blocks ==== ==== Initialization Blocks ====
  
-Τα //initialization blocks// ομοιάζουν με τα //static initialization blocks// με την διαφορά ότι δεν περιέχουν το keyword static. Και αυτά καλούνται με την σειρά που εμφανίζονται στο σώμα της συνάρτησης με την διαφορά ότι καλούνται μέσα σε κάθε κατασκευαστή της κλάσης, όποτε αυτός εκτελείται. Τα //initialization blocks// μπορούν να χρησιμοποιηθούν για να διαμοιραστεί κώδικας μεταξύ διαφορετικών κατασκευαστών (εναλλακτικά μπορείτε να χρησιμοποιήσετε μία βοηθητική συνάρτηση).+Τα //initialization blocks// ομοιάζουν με τα //static initialization blocks// με την διαφορά ότι δεν περιέχουν το keyword static. Και αυτά καλούνται με την σειρά που εμφανίζονται στο σώμα της κλάσης με την διαφορά ότι καλούνται μέσα σε κάθε κατασκευαστή της κλάσης, όποτε αυτός εκτελείται. Τα //initialization blocks// μπορούν να χρησιμοποιηθούν για να διαμοιραστεί κώδικας μεταξύ διαφορετικών κατασκευαστών (εναλλακτικά μπορείτε να χρησιμοποιήσετε μία βοηθητική συνάρτηση).
  
 ==== Final Methods ==== ==== Final Methods ====
  
-Παρακάτω δίνεται ένα παράδειγμα χρήσης //final// μεθόδου για την αρχικοποίηση ενός μη στατικού πεδίου. Μία //final// μέθοδος δεν μπορεί να γίνει //override// από μία άλλη μέθοδο με το ίδιο prototype κατά την διαδικασία της κληρονομικότητας (θα το δούμε παρακάτω, όταν θα εξετάσουμε σε βάθος την κληρονομικότητα).+Παρακάτω δίνεται ένα παράδειγμα χρήσης //final// μεθόδου για την αρχικοποίηση ενός μη στατικού πεδίου. Μία //final// μέθοδος δεν μπορεί να γίνει //override// από μία άλλη μέθοδο με το ίδιο prototype κατά την διαδικασία της κληρονομικότητας (θα το δούμε παρακάτω, όταν θα εξετάσουμε σε βάθος την ιδιότητα της κληρονομικότητας).
  
 <code java> <code java>
Line 75: Line 77:
 </code> </code>
  
-Προφανώς η μέθοδος μπορεί να επαναχρησιμοποιηθεί και σε άλλα σημεία του κώδικα της κλάσης. Η χρήση //final// μεθόδου κρίνεται απαραίτητη για την αρχικοποίηση μη στατικών πεδίων, διότι σε περίπτωση ύπαρξης κληρονόμων της κλάσης μπορεί να υπάρξουν προβλήματα.+Προφανώς οποιαδήποτε //final// μέθοδος μπορεί να επαναχρησιμοποιηθεί και σε άλλα σημεία του κώδικα της κλάσης. Η χρήση //final// μεθόδου κρίνεται απαραίτητη για την αρχικοποίηση μη στατικών πεδίων, διότι σε περίπτωση ύπαρξης υποκλάσεων της κλάσης (μέσω της ιδιότητας της κληρονομικότητας) η μέθοδος μπορεί να οριστεί ξανά στις υποκλάσεις αυτές πράγμα που θα μεταβάλλει τον υφιστάμενο κώδικα αρχικοποίησης.
  
-<code java Bicycle.java> +===== Παράδειγμα αρχικοποίησης στατικών και μη στατικών πεδίων ===== 
-public class Bicycle {+ 
 +<code java Rectangle.java> 
 +class Rectangle { 
 +     
 +  // the Rectangle class has 3 fields 
 +  int width; 
 +  int height; 
 +  Point origin; 
 +   
 +  int id = initializeId();
    
-    private int cadence; +  // add a class variable for the 
-    private int gear; +  // number of Rectangle objects instantiated 
-    private int speed; +  static int numberOfRectangles initNumberOfRectangles();
-  +
-    private int id  = initializeId(); +
-  +
-    private static int numberOfBicycles initNumberOfBicycles();  +
-  +
-    public Bicycle(int startCadence, +
-                   int startSpeed, +
-                   int startGear){ +
-        gear = startGear; +
-        cadence = startCadence; +
-        speed = startSpeed; +
-  +
-        id = ++numberOfBicycles; +
-    } +
-  +
-    public int getID() { +
-        return id; +
-    }+
          
-    // static method for initializing static variable. +  Rectangle(int initWidth, int initHeight, Point initOrigin) { 
-    private static int initNumberOfBicycles() { +    this(initWidth, initHeight); 
-        System.out.println("initialize numberOfBicycles in static method"); +    origin = initOrigin; 
-        return 0; +  } 
-    }+   
 +  Rectangle(int initWidth, int initHeight) { 
 +    width = initWidth; 
 +    height = initHeight; 
 +    origin = new Point(0,0); 
 +    id = ++numberOfRectangles; 
 +    System.out.println("Initialized object id in constructor, id:" + id); 
 +  } 
 +   
 +   
 +  // static method for initializing static variable. 
 +  static int initNumberOfRectangles() { 
 +    System.out.println("initialize numberOfRectangles in static method"); 
 +    return 0; 
 +  }
  
-    //static initialization block  +  //static initialization block  
-    static { +  static { 
-        System.out.println("initialize numberOfBicycles in static block"); +    System.out.println("initialize numberOfRectangles in static block"); 
-        numberOfBicycles = 0; +    numberOfRectangles = 0; 
-    }+  }
  
-    //non-static initialization block  +  //non-static initialization block  
-    +  
-        System.out.println("initialize objectId in block"); +    id = 100; 
-        id 100;  +    System.out.println("initialize objectId in block, id: + id); 
-    }+  } 
 +   
 +  //final method 
 +  final int initializeId() { 
 +    int _id 200
 +    System.out.println("initialize objectId in final method, id: " + _id  ); 
 +    return _id; 
 +  } 
 +   
 +  int getID() { 
 +    return id; 
 +  }
    
-    //final method +  static int getNumberOfRectangles() { 
-    private final int initializeId() { +    return numberOfRectangles
-        System.out.println("initialize objectId in final method"); +  }
-        return 200+
-    }+
          
-    public static int getNumberOfBicycles() { +  void setWidth(int newWidth ) { 
-        return numberOfBicycles+    width = newWidth
-    +  
- +   
-    public String toString(String objName) { +  int getWidth() { 
-      return "["+objName+"."+id+"] Cadence: "+cadence+", Gear: "+gear+", Speed: "+speed+    return width
-    }+  }
          
-    public void printState(String objName) { +  void setHeight(int newHeight ) { 
-      System.out.printlntoString(objName); +    height = newHeight; 
-    }+  } 
 +   
 +  int getHeight() { 
 +    return height; 
 +  }
          
-    public static void main(String args[]) { +  void setOrigin(Point newOrigin) { 
-      Bicycle myBike = new Bicycle(14, 2); +    origin = newOrigin; 
-      Bicycle yourBike = new Bicycle(233); +  } 
-      myBike.printState("myBike"); +   
-      yourBike.printState("yourBike"); +  Point getOrigin() { 
-       +    return origin; 
-      System.out.println("Number of bicycles: "getNumberOfBicycles()); +  } 
-    }+   
 +  int getArea() { 
 +       return width * height; 
 +  } 
 +   
 +  String description(String objName) { 
 +      return "["+objName+"] (id: "+ id +") Width: " + width + ", Height: " + height; 
 +  } 
 +   
 +  public static void main(String []args) { 
 +    System.out.println("-------------------------------"); 
 +    Point p = new Point(10,20); 
 +     
 +    Rectangle rectOne = new Rectangle(30,40p); 
 +    System.out.println("-------------------------------"); 
 +    System.out.println(rectOne.description("rectOne")); 
 +    System.out.println("Number of Rectangles: " + getNumberOfRectangles() ); 
 +  }
 } }
 </code> </code>
  
-Το αποτέλεσμα εκτέλεσης το παραπάνω κώδικα είναι το παρακάτω:+Το αποτέλεσμα εκτέλεσης του παραπάνω κώδικα είναι το παρακάτω:
 <code> <code>
-initialize numberOfBicycles in static method +$ java Rectangle 
-initialize numberOfBicycles in static block +initialize numberOfRectangles in static method 
-initialize objectId in final method +initialize numberOfRectangles in static block 
-initialize objectId in block +------------------------------- 
-initialize objectId in final method +initialize objectId in final method, id: 200 
-initialize objectId in block +initialize objectId in block, id100 
-[myBike.1] Cadence: 1Gear2Speed4 +Initialized object id in constructorid:
-[yourBike.2Cadence2, Gear3Speed3 +------------------------------- 
-Number of bicycles2+[rectOne(id1) Width30Height40 
 +Number of Rectangles1
 </code> </code>
  
-ροηγούμενο: [[:java:static_keyword | Στατικές μεταβλητές και μέθοδοι ]] | Επόμενο: [[ :java:packages:intro | Πακέτα στη γλώσσα προγραμματισμού Java ]]| +<WRAP tip 80% center round> 
- +Από τα παραπάνω προκύπτει ότι η σειρά εκτέλεσης μεταξύ στατικών και μη στατικών μεθόδων, μπλοκ και κατασκευαστών είναι η εξής: 
- +  - Στατικές μέθοδοι 
 +  - Στατικά μπλοκ 
 +  - Μη στατικές //final// μέθοδοι 
 +  - Μη στατικά μπλοκ 
 +  - Κατασκευαστές της κλάσης 
 +</WRAP>
  
 +|Προηγούμενο: [[:java:static_keyword | Στατικές μεταβλητές και μέθοδοι ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:string | Αλφαριθμητικά ]]|
  
java/member_initialization.1429512006.txt.gz · Last modified: 2015/04/20 05:40 (external edit)