java:inner_classes

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Δημιουργία αντικειμένων της εσωτερικής κλάσης ====== ===== Δημιουργία αντικειμένων της εσωτερικής κλάσης στην εξωτερική κλάση ===== Απαραίτητη προϋπόθεση για να δημιουργηθεί ένα αντικείμενο της εσωτερικής κλάσης είναι να υπάρχει ένα αντικείμενο της εξωτερικής κλάσης. Δεν μπορείτε να έχετε δηλαδή οποιαδήποτε αντικείμενο της εσωτερικής κλάσης χωρίς αυτό να συνδυαστεί με ένα αντικείμενο της εξωτερικής κλάσης. Δείτε το παρακάτω παράδειγμα δημιουργίας ενός αντικειμένου της εσωτερικής κλάσης μέσα στον κατασκευαστή της εξωτερικής κλάσης <code java OuterClass.java> public class OuterClass { int outerClassField; InnerClass ic; public OuterClass(int field) { outerClassField = field; ic = new InnerClass(field*2); } class InnerClass { int innerClassField; public InnerClass(int field) { innerClassField = field; } } public String toString() { return "outerClassField: "+outerClassField+", innerClassField: "+ic.innerClassField; } public static void main(String []args) { OuterClass outer = new OuterClass(10); System.out.println(outer); } } </code> ===== Δημιουργία αντικειμένων της εσωτερικής κλάσης από άλλες κλάσεις ή στατικές μεθόδους ===== Προηγούμενα αναφέρθηκε ότι για να δημιουργηθεί ένα αντικείμενο της εσωτερικής κλάσης θα πρέπει να υπάρχει ένα αντικείμενο της εξωτερικής κλάσης. Δείτε πως μπορείτε να δημιουργήσετε σε μία στατική μέθοδο (//όπως είναι η μέθοδος **main**//) ένα αντικείμενο της εσωτερικής κλάσης με βάση την εξωτερική κλάση. <code java OuterClass.java> public class OuterClass { int outerClassField; InnerClass ic; public OuterClass(int field) { outerClassField = field; ic = new InnerClass(field*2); } class InnerClass { int innerClassField; public InnerClass(int field) { innerClassField = field; } public String toString() { return "[innerClassField: "+innerClassField+"]"; } } public String toString() { return "outerClassField: "+outerClassField+" "+ic.toString(); } } class TestOuterClass { public static void main(String []args) { OuterClass outer = new OuterClass(10); System.out.println(outer); OuterClass.InnerClass inner = outer.new InnerClass(4); System.out.println(inner.toString()); } } </code> Αρχικά, δημιουργούμε ένα αντικείμενο της κλάσης **OuterClass**. Στη συνέχεια με δεδομένο ότι έχουμε δημιουργήσει το αντικείμενο τύπου **OuterClass** στο οποίο δείχνει η μεταβλητή //outer// δημιουργούμε ένα νέο αντικείμενο της εσωτερικής κλάσης, όπως παρακάτω. Παρατηρήστε την ιδιαίτερη σύνταξη δημιουργίας αντικειμένων της εσωτερικής κλάσης. <code java> OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4); </code> <WRAP todo 80% round center> Είναι προφανές ότι μπορούμε να φτιάξουμε πολλαπλά αντικείμενα της εσωτερικής κλάσης, με την προϋπόθεση ότι έχουμε τουλάχιστον ένα αντικείμενο της εξωτερικής κλάσης. Τι γίνεται όμως αν παραλείψετε να αρχικοποιήσετε την μεταβλητή της γονικής κλάσης, όπως παρακάτω: <code java TestOuterClass.java> public class TestOuterClass { public static void mian(String args[]) { OuterClass outer; //line 3 OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4); //line 4 } } </code> Σε αυτή την περίπτωση λαμβάνετε από τον μεταγλωττιστή ένα μήνυμα λάθους της μορφής <code> OuterClass.java:29: error: variable outer might not have been initialized OuterClass.InnerClass inner = outer.new InnerClass(4); //line 4 ^ 1 error </code> Δοκιμάστε το. </WRAP> Οι εσωτερικές κλάσεις μπορούν να έχουν προσδιοριστές πρόσβασης (//public, protected, package-private, private//) όπως και τα πεδία της κλάσης. Θα εξηγήσουμε αναλυτικά στη συνέχεια τη σημασία των προσδιοριστών πρόσβασης για τις εσωτερικές κλάσεις. | Προηγούμενο : [[ :java:inner_classes | Μη στατικές εμφωλευμένες κλάσεις ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:inner_class_access | Προσβασιμότητα πεδίων και μεθόδων μεταξύ εσωτερικής και εξωτερικής κλάσης ]] |

java/inner_classes.1494598826.txt.gz · Last modified: 2017/05/12 14:20 by gthanos