עבור לתוכן

צריך הסבר על תוכנית בג'אווה

Featured Replies

פורסם

 public class EqualDemo

{

public static void main(String args[])

{

String str1 = "123";

String str2 = "456";

Yogly ogly1 = new Yogly();

Yogly ogly2 = new Yogly();

if (ogly1.equals(ogly2))

System.out.println("ogly1 is equal to ogly2");

if (str1.equals(str2))

System.out.println("str1 is equal to str2");

}

}





class Yogly

{

int x,y;

public boolean equals(Yogly yo)

{

return (x==yo.x && y==yo.y);

}

}

נלקח מפה http://www.zindell.com/israeliJavaBook/israeliJavaBookWebText3.html

(יש לשנות את הקידוד כדי לראות בעברית )

אם משהו יוכל להסביר לי איך התוכנית הזאת עובדת אשמח

ולא הבנתי את השורה הזאת

    if (str1.equals(str2))

איך str1 יכול לקרוא לפונקציה equals אם הוא לא ממחלקה Yogly ???

ובעיקר לא הבנתי איך הפונקציה equal עובדת

 public boolean equals(Yogly yo)

{

return (x==yo.x && y==yo.y);

}

עריכה : הבנתי איך הפונקציה עובדת . רק השאלה שלי איך

    if (str1.equals(str2))

איך str1 יכול לקרוא לפונקציה equals אם הוא לא ממחלקה Yogly ???

ועוד משהו

 public boolean equals(Yogly yo)

לא היה צריך לעשות ככה ?

equals(yogly yo = new yogly())

פורסם

1. לכל מחלקה בג'אווה מוגדרת המתודה equals (זה מגיע מהירושה מ-object).

בין השאר, גם למחרוזות.

2. לא, מה גרם לך לחשוב שזה צריך להיות ככה...?

פורסם
  • מחבר

1. לכל מחלקה בג'אווה מוגדרת המתודה equals (זה מגיע מהירושה מ-object).

כלומר גם אם לא הייתי רושם את הפונקציה הזאת בכלל בתוכנית

public boolean equals(Yogly yo)

{

return (x==yo.x && y==yo.y);

}

הייתי יכול להשוות בין שתי המחרוזות על ידי הפונקציה equals ?

פורסם

כמובן, אלו שתי מתודות נפרדות (equals שאתה הגדרת וequals של string).

פורסם
  • מחבר

אחלה :) הבנתי את התוכנית :xyxthumbs:

ניסיתי לכתוב בעצמי ווראציה של התוכנית הנ"ל

עריכה : הצלחתי , סליחה על הטירחה.

[attachment deleted by admin]

פורסם
  • מחבר

 class Cord

{



private int x,y;

private byte color;



public void set(int a,int b, byte color)

{

this.x=a;

// the parameter name is different from

// the instance variable name so the use

// of the word this isn't neccesary !



this.y=b;

// the parameter name is different from

// the instance variable name so the use

// of the word this isn't neccesary !



this.color=color;

// the parameter has the same name as

// the instance variable color so the

// use of the word this is necessery

}

public void set(int a,int b)

{

x=a;

y=b;

}



public void set(byte clr)

{

color=clr;

}



public void set()

{

x=y=0;

set((byte)0);

//calling the function set(byte) to set the color

//to be zero. you can use the word 'this'

//but you don't have to !

}



public void set(int a)

{

x=a;

y=a;

}



public boolean equals(Cord otherCord)

{

if (otherCord.x==x && otherCord.y==y)

return true;

else

return false;

}

}





public class ThisDemo

{

public static void main(String args[])

{

Cord CordA1;

Cord CordA2;

// byte clr1=(byte)2;

CordA1=new Cord();

CordA2=new Cord();

// CordA1.set(clr1);

CordA1.set(10);

// Now CordA1 is (10,10) in color 2



CordA2.set(10,10,(byte)2);

// Now CordA2 is (10,10) in color 2 too !



if (CordA1.equals(CordA2))

System.out.println("\nThe two new Cords equal");

}



}

חברים , יש לי שתי שאלות על הקוד הזה :

1. איך זה יכול להיות שיש 5 פונקציות עם אותו שם (set ) כאשר כל אחת עושה משהו אחר

אז אם מהתוכנית הראשית אני קורא ל set , מאיפה אני יודע איזה פונקציה תפעל דווקא ?

2.אשמח להסבר קצרצר על המילה השמורה this ומה היא עושה

תודה .

פורסם

1. הקומפיילר יודע לאיזו פונקציה לקרוא בדיוק לפי מספר הפרמטרים שהוא מקבל, והטיפוסים שלהם. לדוגמה, בקוד שלך, אם אני קורא לפונקציה הבאה (נניח ש-c הוא אוביקט מטיפוס Cord):

c.set();

אז כיוון שלא העברת פרמטרים לפונקציה, הוא יודע לקרוא לפונקציה שלא מקבלת פרמטרים. אם תקרא לפונקציה ככה:

c.set(1,2);

אז הקומפיילר ידע לקרוא לפונקציה שמקבלת שני משתנים מסוג int, כי זה מה שהעברת.

שים לב שיכולות להיות כפילויות משמעות - נניח, הקריאה הבאה:

c.set(1);

במקרה הזה, הקומפיילר לא ידע אם התכוונת לפונקציה שמקבלת byte או לפונקציה שמקבלת int, ולכן הקומפיילר ידווח על שגיאה (יכול להיות שאני טועה, וכברירת מחדל הוא ייקח את ה-int, אבל אני לא בטוח).

2. this מתייחס לאובייקט הנוכחי. לרוב אתה לא צריך אותו, כי יש לך גישה ישירה לאיברים שלו (במקום this.x יכולת פשוט לרשום x).

מתי כן צריך אותו? אם אתה רוצה להתייחס לאובייקט עצמו ולהעביר אותו כפרמטר לפונקציות אחרות.

פורסם
  • מחבר

תודה ! רק שאלה אחרונה אם לדוגמא אני אקרא ככה ל set

 c.set(1(byte),2(byte))

אז זה חוקי ככה ?

פורסם

קודם כל, נראה לי שאתה צריך לשים את ה-(byte) לפני המספר, לא אחריו, כלומר ככה:

c.set((byte)1, (byte)2);

חוץ מזה, ואללה - אין לי מושג. אני מניח שהקומפיילר יידע לבצע את ההמרה האוטומטית חזרה ל-int. הדרך הכי טובה לדעת היא לנסות.

פורסם

תודה ! רק שאלה אחרונה אם לדוגמא אני אקרא ככה ל set

 c.set(1(byte),2(byte))

אז זה חוקי ככה ?

בעיקרון זה תלוי באיזה קומפיילר משתמשים, יש קומפיילרים שידעו לשנות את ה-byte ל-int ויש כאלה שיצעקו על זה.

ברמת העיקרון זה לא אמור לעבוד כי int הוא טיפוס פרימיטיבי ולכן אין לו פונקציית בנאי שמקבלת byte ולכן הקומפיילר לא יודע איך לבצע את השינוי.

פורסם

גאווה לא עוןשה המרות אוטו.

פורסם

ג'אווה לא, אבל יש קומפיילרים כמו JBuilder למשל שיודעים לעשות את ההמרות לבד.

פורסם

כל הקומפיילרים של JAVA הם אותו אחד - זה שהתקנת עם הJDK. אתה מדבר על סביבת עבודה. בJAVA אתה לא יכול לשלוח לו INT ולקוות שהוא ימיר את זה לBYTE. חלק מסביבות העבודה מזהות שיש שם שגיאת קומפילציה, והם מודיעות לך על זה, ומציעות דרכים לתקן.

פורסם
  • מחבר

 class Kushkush

{

private int x,y;



public Kushkush()

{

this(0,0);

}



public Kushkush(int a, int b)

{

x=a;

y=b;

}



public Kushkush(int a)

{

this(a,a);

}



public void set(int a,int b)

{

x=a;

y=b;

}

public boolean equals(Kushkush otherKushkush)

{

if (otherKushkush.x==x && otherKushkush.y==y)

return true;

else

return false;

}

public void display()

{

System.out.println("\nx="+x+" y="+y);

}

}





class ClassVecDemo

{

public static void main(String args[])

{

int index;

Kushkush kushkushs[];





kushkushs = new Kushkush[10];


for (index=0; index<10; index++)

{



kushkushs[index] = new Kushkush(index+1,index+1);

}

for (index=0; index<10; index++)

{


kushkushs[index].display();

}

}

}

הפלט של התוכנית הוא כזה

x=1 y=1

x=2 y=2

....

.....

....

.....

....

x=10 y=10

לא הבנתי את השורה הזאת

kushkushs[index] = new Kushkush(index+1,index+1);

המערך קושקוש ;D בעל 10 איברים , ובכל איבר נמצא אובייקט מסוג קושקוש :screwy: ?

האם יש הגבלה לכמות נתונים שאפשר להכניס לאיבר אחד במערך ? או שבעצם בג'אווה אני יכול להכניס אין סוף נתונים לאיבר אחד במערך אחד ?

עריכה :ראיתי שיש מערכים של int ו char .....ששמה יש הגבלה לנתונים שבכל איבר שבמערכך

האם במערך של אובייקטים יש איזשהי הגבלה לכמה נתונים אפשר להכניס לכל איבר ?

פורסם

המערך קושקוש ;D בעל 10 איברים , ובכל איבר נמצא אובייקט מסוג קושקוש :screwy: ?

המערך בעל 10 איברים, וכל איבר הוא מסוג קושקוש.

השורה הזו:

kushkushs = new Kushkush[10];

יוצרת מערך בגודל 10, שמכיל 10 null-ים (אובייקטים שלא קיימים).

הלולאה שבאה אח"כ ממלאת את המערך - בכל מקום במערך שמה אובייקט חדש מטיפוס KushKush (במקום ה-null שהיה שם קודם).

כל איבר במערך הוא משתנה בפני עצמו. אתה יכול להחליף את הערך שבו, לא להוסיף ערך.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים