מחלקה אבסטרקטית ב-Java היא מחלקה שלא ניתן ליצור ישירות. המטרה של זה היא לשמש כמחלקה בסיס שממנה עשויות המעמדות האחרים לעבור בירושה ולהרחיב. אחת התכונות החשובות שלמחלקה מופשטת יש יכולת להגדיר את הבנאים, הידועים כמתודות מיוחדות ואשר מופעלות כאשר אובייקט של מחלקה נוצר.
כללים שיש לפעול לפיהם בעת הגדרת בנאים במחלקה מופשטת:
- למחלקות מופשטות יכולות להיות בנאים, אך לא ניתן ליצור אותן ישירות. הבנאים משמשים כאשר נוצרת תת מחלקה בטון.
- עשויה להיות מתודה מופשטת אחת או יותר במחלקה מופשטת, מה שמסמל ששיטות אלו אינן מיושמות באמצעות המחלקה. כדי להיות מופע, תת-מחלקה שמרחיבה מחלקה מופשטת עם שיטות מופשטות צריכה ליישם את המתודות. זה אומר שכל שיטה מופשטת המוצהרת בתוך מחלקה מופשטת צריכה להיות מימוש אם תת-מחלקה צריכה להיות מחלקה קונקרטית וניתן יהיה להפעיל אותה. במילים אחרות, הפונקציונליות שהמחלקה המופשטת השאירה פתוחה חייבת להתמלא על ידי תת המחלקה.
- כאשר תת-מחלקה מרחיבה מחלקה מופשטת עם בנאים, תת-המחלקה צריכה לקרוא לאחד הבנאים בתוך מחלקת העל בעזרת מילת-על. מכיוון שבנאי מחלקות העל מאתחל את מצב האובייקט ומאחד את כל המשאבים החיוניים. אם תת-המחלקה לא תקרא כעת לאחד הבנאים ב- superclass, האובייקט לא יאתחל היטב וכעת לא יפעל בצורה יעילה/נכונה.
- זה אפשרי להגדיר יותר מבנאי אחד במחלקה מופשטת, בדומה למחלקה אחרת. עם זאת, כל בנאי צריך להיות מוגדר עם רשימת פרמטרים שונה. זה מאפשר לתתי מחלקות לבחור לאיזה בנאי להתקשר על סמך הצרכים הספציפיים שלהם.
סוגי בנאים המיושמים באמצעות מחלקה מופשטת:
ישנם שלושה סוגים של בנאים, אם הם קיימים:
- ברירת המחדל של קונסטרוקטור
- קונסטרוקטור בעל פרמטרים
- העתק קונסטרוקטור
1. יוצר ברירת מחדל: הבנאי נוצר אוטומטית דרך Java אם לא מוגדר בנאי אחר במחלקה. אין לו פרמטרים והוא אינו מבצע כל מהלכים מלבד אתחול ערכי ברירת המחדל עבור שדות מחלקה.
אַלגוֹרִיתְם:
שלב 1: הגדר מחלקה מופשטת בשם 'צורה'.
שלב 2: הכריז על שני משתנים שלמים 'x' ו-'y' כמוגנים.
שלב 3: צור בנאי ברירת מחדל של מחלקת Shape והגדר את 'x' ו-'y' ל-0.
שלב 4: כעת צור שיטה 'getArea()' זו שיטה מופשטת שהולכת להחזיר ערך כפול
שלב 5: לאחר מכן צור שתי שיטות לא מופשטות 'printPosition()' ו-'setPosition(int x, int y)' השייכת למחלקה Shape.
שלב 6: שיטת setPosition מגדירה את הערכים של x ו-y.
שלב 7: שיטת printPosition מדפיסה את הערכים של x ו-y.
שלב 8: הגדר מחלקה Circle שמרחיבה את המחלקה Shape.
שלב 9: הכריז על משתנה כפול בשם 'רדיוס' כמוגן במחלקה Circle.
שלב 10: הגדר בנאי למחלקה Circle שמקבל ערך כפול עבור הרדיוס.
שלב 11: הטמיעו את שיטת getArea עבור המחלקה Circle אשר מחשבת את שטח המעגל.
שלב 12: הגדר מחלקה ריבועית שמרחיבה את המחלקה Shape.
שלב 13: הכריז על משתנה כפול בשם 'צד' כמוגן במחלקה Square.
שלב 14: הגדר בנאי למחלקה Square שמקבל ערך כפול עבור הצד.
שלב 15: הטמיעו את שיטת getArea עבור המחלקה Square אשר מחשבת את שטח הריבוע.
שלב 16: הגדר מחלקה ראשית.
שלב 17: הגדר את הפונקציה הראשית במחלקה Main.
שלב 18: צור אובייקט Circle ואובייקט מרובע.
שלב 19: קרא לשיטת setPosition הן עבור האובייקטים Circle והן עבור האובייקטים המרובעים.
שלב 20: קרא לשיטת getArea הן עבור האובייקטים Circle והן עבור האובייקטים הריבועיים והדפיסו את התוצאות.
שלב 21: קרא לשיטת printPosition הן עבור האובייקטים Circle והן עבור האובייקטים המרובעים והדפיסו את התוצאות.
יישום:
הנה היישום של השלבים לעיל
שם קובץ: DefaultMain.java
import java.util.*; abstract class Shape { protected int x; protected int y; // default constructor public Shape() { // initialize default values for fields x = 0; y = 0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The Position: ('+x + ', '+ y +')'); } } class Circle extends Shape { protected double radius; // constructor public Circle(double radius) { this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // constructor public Square(double side) { this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class DefaultMain { public static void main(String args []) { // create a Circle object Circle circle = new Circle(5); circle.setPosition(2,3); // print the area and position of the Circle object System.out.println('Area of a circle is: '+circle.getArea()); circle.printPosition(); // create a Square object Square square = new Square(4); square.setPosition(5, 7); // print the area and position of the Square object System.out.println('Area of a square is: '+square.getArea()); square.printPosition(); } }
תְפוּקָה:
Area of a circle is: 78.53981633974483 The Position:(2, 3) Area of a square is: 16.0 The Position:(5, 7)
2. קונסטרוקטור בעל פרמטרים: בעת יצירת אובייקט, סוג זה של בנאי מאפשר להעביר אליו ארגומנטים. כאשר אתה רוצה לאתחל את האובייקט עם ערכים, זה מועיל. הבנאי עם הפרמטרים מוגדר עם פרמטר אחד או נוסף, ובזמן שנוצר אובייקט, הערכים המועברים לבנאי משמשים לאתחול השדות המתאימים של הפריט.
קבל אורך מערך ב-c
אַלגוֹרִיתְם:
שלב 1: הגדר מחלקה מופשטת Shape.
שלב 2: הוסף שני משתני מופע מוגנים מסוג int בשם x ו-y.
שלב 3: צור בנאי בעל פרמטר שמאתחל את משתני המופע x ו-y ומקבל שני פרמטרים מסוג int, x ו-y.
שלב 4: הגדר מחלקה מופשטת Shape.
שלב 5: הוסף שני משתני מופע מוגנים מסוג int בשם x ו-y.
שלב 6: צור בנאי בעל פרמטר שמאתחל את משתני המופע x ו-y ומקבל שני פרמטרים מסוג int, x ו-y.
שלב 7: הגדר מעגל מחלקה שמרחיב את הצורה.
שלב 8: הוסף משתנה מופע מוגן מסוג כפול בשם רדיוס.
שלב 9: הגדר בנאי בעל פרמטרים שלוקח שלושה פרמטרים מסוג int x, y ורדיוס כפול ומאתחל את משתני המופע x, y ורדיוס באמצעות מילת המפתח super() .
שלב 10: יישם את השיטה המופשטת getArea() על ידי חישוב השטח של Circle.
שלב 11: הגדר מחלקה ריבוע שמרחיב את הצורה.
שלב 12: הוסף משתנה מופע מוגן מסוג double named side.
שלב 13: הגדר בנאי בעל פרמטרים שלוקח שלושה פרמטרים מסוג int x, y וצד כפול ומאתחל את משתני המופע x, y והצד באמצעות מילת המפתח super() .
שלב 14: יישם את השיטה המופשטת getArea() על ידי חישוב השטח של Square.
שלב 15: הגדר מחלקה Main.
שלב 16: הגדר שיטה סטטית בשם main() שהיא נקודת הכניסה של התוכנית.
שלב 17: צור אובייקט Circle באמצעות בנאי בעל פרמטרים.
שלב 18: הדפס את השטח והמיקום של האובייקט Circle באמצעות שיטות getArea() ו-printPosition() בהתאמה.
שלב 19: צור אובייקט ריבועי באמצעות בנאי בעל פרמטרים.
שלב 20: הדפס את השטח והמיקום של האובייקט Square באמצעות שיטות getArea() ו-printPosition() בהתאמה.
שלב 21: סוף התוכנית.
יישום:
יישום השלבים לעיל המוזכרים להלן
שם קובץ: ParameterizedMain.java
import java.util.*; abstract class Shape { protected int x; protected int y; // parameterized constructor public Shape(int x,int y) { this.x=x; this.y=y; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The position: ('+ x+', ' +y+')'); } } class Circle extends Shape { protected double radius; // parameterized constructor public Circle(int x,int y,double radius) { super(x,y); this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // parameterized constructor public Square(int x,int y,double side) { super(x, y); this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class ParameterizedMain { public static void main(String args []) { // create a Circle object with parameterized constructor Circle circle = new Circle(2, 3, 5); // print the area and position of the Circle object System.out.println('Area of circle is: '+circle.getArea()); circle.printPosition(); // create a Square object with parameterized constructor Square square = new Square(5, 7, 4); // print the area and position of the Square object System.out.println('Area of square is:' +square.getArea()); square.printPosition(); } }
תְפוּקָה:
Area of circle is: 78.53981633974483 The position: (2, 3) Area of square is:16.0 The position: (5, 7)
3. העתק בנאי: בונה העתקה משמש ליצירת אובייקט חדש עם הערכים השווים כאובייקט קיים (כלומר, הפריט נוצר לפני). זה שימושי בזמן שאנחנו צריכים ליצור אובייקט חדש שעשוי להיות העתק של אובייקט שכבר קיים/קיים. בונה העתקה מוגדר עם ארגומנט אחד בלבד או פרמטר אחד שהוא פריט במחלקה זהה. לאחר מכן הבנאי יוצר אובייקט חדש עם אותם ערכים כמו אובייקט פרמטר.
אַלגוֹרִיתְם:
שלב 1: הכריז על מחלקה מופשטת עם משתני מופע ובנאי ברירת מחדל.
שלב 2: הגדר בנאי העתקה עם פרמטר מסוג מחלקה זהה.
שלב 3: ב-copy constructor, קרא לבנאי העתקת סופר-class באמצעות מילת המפתח סופר כדי להעתיק את משתני המופע מאובייקט הפרמטר לאובייקט החדש.
שלב 4: הקצה את הערכים של כל משתני מופע נוסף בתוך תת המחלקה לפריט החדש.
שלב 5: יישם את השיטה המופשטת לחישוב השטח.
שלב 6: הגדר כל שיטות אחרות לפי הצורך.
שלב 7: בפונקציה הראשית, צור אובייקט של המחלקה.
שלב 8: הגדר את המיקום וכל משתני מופע אחר לפי הצורך.
שלב 9: צור אובייקט חדש באמצעות הבנאי העתקה והעברת הפריט המקורי כפרמטר.
שלב 10: הדפס את השטח והמיקום של האובייקט המקורי וגם של האובייקטים שהועתקו.
יישום:
יישום השלבים לעיל מובא להלן
שם קובץ: CopyMain.java
import java.util.*; abstract class Shape { protected int x; protected int y; // copy constructor public Shape(Shape other) { this.x=other.x; this.y=other.y; } // default constructor public Shape() { // initialize default values for fields x=0; y=0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x =x; this.y =y; } public void printPosition() { System.out.println('Position: (' +x+ ', ' +y+ ')'); } } class Circle extends Shape { protected double radius; // copy constructor public Circle(Circle other) { super(other); this.radius =other.radius; } // constructor public Circle(double radius) { this.radius =radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // copy constructor public Square(Square other) { super(other); this.side =other.side; } // constructor public Square(double side) { this.side=side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class CopyMain { public static void main(String[] args) { // create a Circle object Circle circle1 = new Circle(5); circle1.setPosition(2,3); // create a copy of the Circle object using the copy constructor Circle circle2 = new Circle(circle1); // print the area and position of the original and copied Circle objects System.out.println('Original Area of circle: ' +circle1.getArea()); circle1.printPosition(); System.out.println('Copied Area of circle: '+circle2.getArea()); circle2.printPosition(); // create a Square object Square square1 =new Square(4); square1.setPosition(5,7); // create a copy of the Square object using the copy constructor Square square2 = new Square(square1); // print the area and position of the original and copied Square objects System.out.println('Original Area of square: '+square1.getArea()); square1.printPosition(); System.out.println('Copied Area of square: '+square2.getArea()); square2.printPosition(); } }
תְפוּקָה:
Original Area of circle: 78.53981633974483 Position: (2, 3) Copied Area of circle: 78.53981633974483 Position: (2, 3) Original Area of square: 16.0 Position: (5, 7) Copied Area of square: 16.0 Position: (5, 7)