1 אובייקטים
היום בתרגול: 2.)objects מחלקות )classes( ואובייקטים )מופעים, )fields( שדות המחלקה שיטות הכמסה )methods של מחלקה. (
class מחלקה - עד עכשיו השתמשנו בעיקר בטיפוסים מובנים ופונקציות המבצעות חישובים או פעולות מסוימות על ערכים מטיפוסים אילו. לעיתים טיפוסים פרימיטיביים אינם מספיקים לכתיבה נוחה המתכנת יכול להגדיר טיפוסים חדשים )מחלקות( לפי הצורך, ליצור ערכים )אובייקטים( ולהגדיר משתנים מטיפוסים אלה. כל טיפוס יציין אילו נתונים נשמרים בו )ע"י שדות( ויהיה אחראי לספק שירותים כלפי חוץ שנוגעים לנתונים השמורים בו )ע"י שיטות( 3
4
איך זה נראה? 5 מחלקות )classes( - טיפוסים חדשים מוגדרים ע"י מתכנת אובייקטים )objects( או מופעים )instances( - ערכי המשתנים הנוצרים מטיפוסים אלו. int i; Student s; משתנים משתני ם טיפוס מובנה משתנה מטיפוס Student מחלקה )טיפוס המוגדר ע"י המתכנת(
ת" ת" ת" אז מה חדש כאן? 6.1.2 למופע,instance( אובייקט( של מחלקה יש "מצב" ) state (,שהוא ערכי המשתנים הפנימיים של האובייקט, הנקראים "שדות".)fields( למופע של מחלקות יש גם "ההתנהגות",)behavior( שהיא אוסף ה"שיטות" )methods( של המחלקה שהאובייקט יכול להפעיל.... הדפס ממוצע הרשם לקורס הדפס שם סטודנט: "שם"=?.ז"=? "ממוצע"=?... הדפס ממוצע הרשם לקורס הדפס ממוצע הרשם לקורס סטודנט: "שם"= Alice.ז"= 2111 "ממוצע"= 99...... סטודנט: "שם"= Bob.ז"= 3121 "ממוצע"= 9 3... הדפס שם... הדפס שם
ראינו כבר משהו דומה... 7 אובייקט String str = new String("abcd"); System.out.println(str.charAt(2)); charat(int index) ".String str
הגדרת מחלקה = הגדרת טיפוס חדש דוגמה: מספרים מרוכבים a real part b imaginary part מספר מרוכב הוא מספר מהצורה a + b i נגדיר מחלקה לייצוג מספרים מרוכבים: public class Complex{ public double real; public double im; 8
צ ם :new Complex c; c = new Complex(); /* memory allocation */ c.real = 17.2; c.im = 1.3333; : ).( גישה לשדות של אובייקטים אופרטור השייכות 9
איך זה נראה בזכרון? Complex c1, c2, c3; //#1 c2.real = 2; c2.im = 2.5; //#3 c1 = new Complex(); c1.real = 1; c2 = c1; //#4 c1.im = 1.5; c1.im = 2.2; c2= new Complex(); c3 = new Complex(); c2.real = 1; c3.real=0.12; c2.im = 1.5; //#2 c3.im = c2.im; //#5 c1 #1 #2 #3 #4 #5 1 1.5 1 1.5 1 1.5 1 2.2 c2 1 1.5 2 2.5 c3 0.12 2.2
שיטות ניתן להוסיף למחלקה גם פונקציות המבצעות חישוב על שדות האובייקט. פונקציות של המחלקה נקראות שיטות. בנאים בנאים הם שיטות מיוחדות הנקראות בכל פעם שנוצר אובייקט חדש. משתמשים בבנאי כדי לתת ערכים התחלתיים לאובייקט. שיטות 11 Complex: double real; double im;
בנאי שיטה מיוחדת עבור מחלקה שתפקידה לייצר אובייקט ולאתחל את שדותיו 12 public class Complex{ public double real; public double im; public Complex(){ this.real = 0; this.im = 0; השם זהה לשם המחלקה ואין ערך החזרה Complex: double real; double im; Complex()
ניתן להוסיף בנאים אחרים: 13 public Complex(double realpart, double impart){ this.real = realpart; this.im = impart; - Copy constructor יצירת אובייקט חדש על בסיס אובייקט קיים מאותו טיפוס public Complex(Complex other){ this.im = other.im; this.real = other.real; {
14 אם לא הגדרנו בנאי כלשהו, Java מספקת לנו בנאי ברירת מחדל constructor( )default אשר מבצע השמה של ערכי ברירת המחדל לכל השדות: public Complex(){ this.im = 0; this.real = 0; בדרך כלל נספק בנאי משלנו
במידה והגדרנו בנאי כלשהו במחלקה, Java כבר לא תספק לנו ה-.default constructor אם נרצה שלמחלקה יהיה בנאי ללא פרמטרים בכל זאת, נצטרך להגדיר אותו בעצמנו : public class Complex{ public double real; public double im; public Complex(double realpart, double impart){ this.real = realpart; this.im = impart; c1 = new Complex(); : שגיאת קומפילציה אם ננסה ליצור אובייקט בצורה הבאה
שיטות Methods 16 על מנת שנוכל להדפיס מספרים מרוכבים בצורה נוחה, נוסיף שיטה אשר מחזירה מחרוזת הכוללת את הייצוג של המספר המרוכב. public class Complex{ נוסיף למחלקה Complex את השיטה :tostring Complex() public String tostring() { String ans = real+" + "+ im + " i"; return ans; tostring() Complex: double real; double im; Complex( double rp, double ip) ניתן להשתמש בשיטה באופן הבא: Complex c1 = new Complex(5,2); System.out.println(c1.toString()); מודפס: 5.0 + 2.0 i
מה תדפיס התכנית הבאה? 17 Complex c1 = new Complex(10.4, 20); Complex c2 = new Complex(15, 1); System.out.println(c1.toString()); System.out.println(c2.toString()); Output: 10.4 + 20.0 i 15.0 + 1.0 i שימו לב: מודפסים שני ערכים שונים אין שיתוף שדות בין האובייקטים השיטות משותפות לכל האובייקטים מהמחלקה ערכי השדות לא משותפים
ניתן לבצע פעולות על מספרים מרוכבים, - מוחלט. הפעולה מוגדרת באופן הבא: ערך למשל a + bi = a*a + b*b 18
ף צ. גד. Complex ז public class Complex{ public double real; public double im; public double abs(){ return Math.sqrt(real*real + im*im); 19
. ף ד ד Complex public class Complex{ public double real; public double im; public void update(double otherreal, double otherim){ this.real = otherreal; this.im = otherim; 20
21 שיטה יכולה לשנות את השדות של האובייקט! שימו לב: השיטה update ניגשת למשתנים של האובייקט ומשנה אותם. כלומר, השיטה משנה את מצב האובייקט. Complex c1 = new Complex(1, 0.5); c1.update(11.1, 9.5); System.out.println(c1.toString()); // 11.1 + 9.5 i
הכמסה )encapsulation( 22 עקרון המאפשר לאובייקט להכיל את המצב שלו ואת השיטות הקשורות לו. הרעיון: הצגת היכולות של אובייקט ע"י השיטות שמוגדרות כ-,public וללא הצגת המבנה הפנימי של האובייקט )כיצד הוא בנוי( המשתמש לא צריך לדעת כיצד האובייקט עובד, רק מה הוא עושה אלא רעיון זה דומה לרעיון שפונקציה מבצעת פעולות מסוימות, ומי שמשתמש בפונקציה, לא צריך לדעת כיצד היא ממומשת
הכמסה )encapsulation( 23 מה משיגים בעזרת הכמסה והגבלת גישה: שמירה על חוקיות המצב של האובייקט ניתן לקבוע אילו ערכים מייצגים מצב חוקי ואילו לא.1 פשטות מי שכותב את המחלקה קובע מה המשתמש צריך לדעת על האובייקט ומה לא.2 3. גמישות במימוש ובשינוי המימוש
Setters ו- Getters 24 אחת מהטכניקות שתעזור לשמור על עקרון ההכמסה היא שימוש בשיטות על מנת לחשוף את המצב של האובייקט getter שיטה אשר מחזירה ערך של שדה מסוים setter שיטה אשר קובעת ערך של שדה מסוים בעזרת השיטות האלו נוכל לשנות את מצב האובייקט, תוך כדי שמירה על עקרון ההכמסה
Setters ו- Getters 25 public class Complex{ public double real; public double im; דוגמה public double getreal() { return this.real; public void setreal(double newvalue) { this.real = newvalue; getter setter
Visibility Modifiers 26 public class Complex{ public double real; מה הבעיה בדוגמה הקודמת? public השדה real מוגדר כ- לכן עדיין ניתן לשנות את ערכו מחוץ למחלקה, לדוגמה: Complex c = new Complex(); c.real = 13.0;
Visibility Modifiers 27,Java ניתן להגביל גישה לשדה בעזרת שינוי visibility modifier של השדה ב- ה- כבר ראינו שימוש ב-,public :visibility modifier אשר מאפשר גישה לשדה לכולם )גם מחוץ למחלקה( ישנו visibility modifier נוסף: private אשר מגביל את הגישה לשדות, כך שרק שיטות של המחלקה יוכלו לגשת אליו
Visibility Modifiers 28 public class Complex { private double real; מה יקרה בדוגמה הבאה: כאשר ננסה לגשת לשדה ממחלקה אחרת? Complex c = new Complex(); c.real = 13.0; נקבל שגיאת קומפילציה היות ואנחנו מנסים לגשת לשדה פרטי. נוכל לתקן את זה על ידי שימוש בsetter.
29 Visibility Modifiers ראינו כי ניתן להגביל גישה לשדה, אך ניתן להגביל גישה גם עבור שיטות של המחלקה ניתן לקבוע חלק מהשיטות כ- private )public )במקום שיטה שמוגדרת כ- private משמשת כשיטת עזר לביצוע פעולות פנימיות של המחלקה
this 30 ראינו כי ניתן להגדיר מספר בנאים למחלקה בעזרת העמסה )Overloading( ניתן לקרוא מבנאי אחד לבנאי אחר בעזרת המילה this השמורה: לדוגמה: מה היתרון בשימוש בדרך זו? public MyString(MyString other){ this(other.elements); ( ) הקריאה חייבת להתבצע בשורה הראשונה של הבנאי
this 31 דוגמה נוספת: מה עושה הבנאי השני? public class MyString{ private char[] elements; private int length; public MyString(String s) { public MyString() { this("");
this 32 ניתן להשתמש ב - this על מנת להבדיל בין שדה לבין פרמטר או משתנה לוקאלי בעלי אותו שם. לדוגמה: public class MyString{ private char[] elements; private int length; בעזרת האופרטור ).( public MyString(char[] elements, int length) { this.length = length; this.elements = new char[this.length]; for (int i = 0; i < this.length; i=i+1) this.elements[i] = elements[i];
Dynamic Array 33 Design class DynamicArray, representing a growing array. The underlying array has some initial capacity, and logical size 0. Once logical size is over capacity, underlying array doubles in size. Create a dynamic array of capacity 10, and add 100 numbers to it, where each number is previous number + 2. Multiply each number in the array by 3. Print the array using its String conversion method
34 Dynamic Array
35 Dynamic Array - Impl
36 Dynamic Array - Impl
37 Dynamic Array - Impl
38 Dynamic Array - Usage