إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

OOP for Beginners

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • OOP for Beginners

    ال Tutorial دى مش هتعلمك كل شئ ولكن هتديك الكافى لتبدأ فى طريقك بنفسك ان شاء الله

    Contents :

    1- Classes
    2- Inheritance
    3- Interfaces and Abstract Classes
    4- Overloading Constructors/Methods
    انا بحب NetBeans فدا اللى هنستخدمه .. لو بتحب Eclipse براحتك ولو عايز تستخدم VIM بردو براحتك! بس اقل شئ تكون بتعرف تتعامل مع ال javac وال java اوكى ؟


    البرنامج فى Java بيتقسم ل Classes .. لأن Java نفسها Fully OOP ! فى ابسط الأكواد هتحتاج تستخدمها فى Classes مش هتستخدم ال Structured Programming زى ال C++ اللى بتسمحلك بالإتنين.


    Hello, World!
    تقليد قديم إن اى لغة يتعمل فيها اى شرح او كتب تبدأ ب Hello, World وانا همشى على التقليد دا :p
    كود:
    class Hello{
        public static void main(String[] args) {
            System.out.println("Hello, world");
        }
    }
    إحفظه بإسم Hello.java
    اكتب التالى
    javac Hello.java
    java Hello
    hال Output هيكون
    Hello, World!
    هنشرح الكود
    اولا class دا keyword فى ال Java بتستخدم فى تعريف ال classes
    HelloWorld دا إسم ال Class بتاعنا ولاحظ إنه هو هو إسم ال برنامج!
    ال public static void main(String[] args)
    ال main هى الدالة اللى بيبدأ عندها تنفيذ البرنامج -زى C/C++/C# .. etc -
    public هى Access Modifier خاص بصلاحيات الدالة -main – وكونه public بيسمح إن اى حد يستخدمها وهنا الحد دا هو ال JVM
    static بتعنى إن الدالة دى مرتبطة بال Class مش باى instance منه ! .. هنتكلم فيها بعدين بالتفصيل إن شاء الله.
    Void – هتشوفها فى لغات كتير فهديلك مثال عليها .. تخيل إنك ركبت صاروخ وخرجت من الجاذبية ووصلت للفراغ .. بص حواليك إيه اللى إنت شايفه ؟ فراغ او لا شئ .. دا معنى void :D
    ال main مش بتدى اى return فهيكون ال type بتاعها لاشئ او فراغ او void قشطة ؟
    String[] args
    دى بتعبر عن ال command line arguments .. ال arguments اللى هتتباصى للبرنامج مثلا إنت شغلته بالطريقة دى
    java Hello arg1 arg2 arg3
    ال arg1, arg2, arg3 دى اولا Strings فهتتمثل على إنها Strings وممكن تبقة واحدة او اكتر .. فعشان التنظيم بنعبر عنها ب Array من ال Strings !
    args[0] = arg1
    args[1] = arg2
    args[2] = arg3
    وهكذا
    ال System.out.println دى فنكشن بتستخدم فى الطباعة .. ولاحظ إن ال ln بتضيف سطر جديد تلقائى من نفسها !

    Commenting
    ال Java بتدعم
    1- ال C Style بإستخدام /* */
    2- ال C++ Style بإستخدام ال //
    3- بإستخدام ال /** */ وهى ال Documentations Comments وبتستخدم فى التوثيق.

    نتكلم عن ال OOP فى الJava وهتريحنا كتير وهنشرح حاجات فى وسط كلامنا
    معظم اللغات بتتقسم إلى 2
    1- Structured/Procedural Programming Languages
    بيتقسم البرنامج فيها على هيئة Modules و Functions و Structures زى ال C
    2- Object Oriented Programming Languages
    وهى بتتقسم فيها الأكواد على هيئة Classes
    المهم الواحد إذا فهم ال OOP كويس هيلقة قدامه الطريق مفتوح إنه يتعلم لغات كتير زى Java/C++/C# وغيرهم
    تخيل إنك بتصمم Human على الورق
    ال Human دا اولا ليه صفات مثلا طوله ووزن .. الصفات دى بنسميها Attributes او Fields فى بعض اللغات .. فى ال Java بتسمى Field فإتعود على الكلمة!
    ال Human دا بردو ليه اكشنز او Behaviors او افعال هو بيعملها زى إنه يمشى وبينام وبياكل وبيشرب!
    هنطبق كل الرغى اللى قولناه دا
    كود:
    public class Human {
        /*Fields*/
        private String name;
        private int age;
        private int  height;
        private float weight; 
        public void move(){ 
        }
        public void sleep(){       
        }
        public void eat(){
        }
        public void drink(){
        }
    }
    يعنى إيه public و private ؟
    public قولنا عشان نسمح لأى حد إنه يستخدم ال Field او ال method او غيرهم فبنخليه public
    private عشان نمنع اى حد إنه يستخدم ال Field او ال method او غيرهم خارج ال class نفسه وهتشوف بعد شوية.
    وتعود دائما على شئ إنك وانت بتصمم اى class فى java او اى لغة غيرها .. ان ال Fields تكون private وتتحكم فيها ياإما عن طريق getters/setters -ميثودز- او تستخدم Properties ولكن للأسف java مش بتدعم ال properties فهنستخدم ال getters/setters فى باقى الشرح.
    وتعود إن ال Methods بتاعتك تكون public إلا إذا كان فى هدف ليك فى إنك تخلى method private !
    إيه int , float, String دول ؟
    الإسم دا عبارة عن كلمة او نص يبقة اول ماتقول ان الإسم دا عبارة عن نص يبقة عبارة عن String!
    العمر .. لما بتسأل واحد عن عمره غالبا بيرد عليك بعد صحيح فهنا نوع age هيكون int
    لما بتكلم واحد عن طوله فبردو بيرد عليك بصورة عدد صحيح فهيكون ال height نوعه int بردو
    الوزن مثلا واحد وزنه كبير يقلك انا 199 كيلو ونص او و 0.4 : p
    اى رقم فيه Floating point او زى مابنقول period او dot او علامة عشرية حسب انت من اى بلد فى العالم فبنقول عليه Float
    وكتبنا ال Behaviors بتاعت ال Human اللى اتكلمنا عنها إنه بياكل ويشرب ويتحرك وينام!
    لاحظ إن Behaviors او الأفعال بنستخدم مكانها كلمة شائعة اكتر وهى methods
    لكن لاحظ شئ مهم .. ان دا لحد دلوقتى تصميم على الورق!!
    دا بكل بساطة معنى كلمة Class هو التصميم والتخيل بتاعنا لشئ او نوع معين!
    لكن احنا محتاجين نخلى الClass دا على ارض الواقع ؟ إذا اتعمل على ارض الواقع بقة إسمه Object
    اذا اتخلق إنسان بقة إسمه Object ! او انشأت عربية او بينت بيت بيبقة إسمهم Objects
    كدنا إنت عديت حوالى 50% من المطلوب منك :D
    تعالى نكتب شوية اكواد فى الclass بتاعنا لأن شكله وحش كدا وهو فاضى!
    كود:
    public class Human {
        
        /*Fields*/
        private String name;
        private int age;
        private int height;
        
        /*Constructor*/
        public Human(String name, int age, int  height){
            this.name=name;
            this.age=age;
            this.height=height;
                   
        }
        
        public void move(){
            System.out.println("Hey, I'm moving!");
        }
        public void sleep(){
            System.out.println("I'm sleeping, BACK OFF!");
        }
        public void eat(){
            System.out.println("I'm eating, join me!");
        }
        public void drink(){
            System.out.println("I'm Drinking!");
        }
    الشئ الوحيد الجديد علينا هو ال Constructor
    كود:
        /*Constructor*/
        public Human(String name, int age, int  height){
            this.name=name;
            this.age=age;
            this.height=height;          
        }
    عايزك تفهم شئ ال Constructor ماهو إلا method ولكن خاصة شوية .. لأنها اول method بيتم إستدعاؤه لما يجى يتعمل اى Object وهى المسئولة يتعمل initialize لل fields يعنى مثلا فى المثال بتاعنا ادينا قيم لل name, age, height الموجودة فى ال Class ال fields يعنى ولكن لاحظ إن فى ا لmethod ال argument كانت اساميها تلخبط !
    يعنى لما نيجى نستخدم كلمة name جوا ال Constructor هل احنا نقصد الخاصة بال class ولا نقصد ال argument اللى باصينها لل Constructor .. شئ محير صح ؟
    فعشان كدا بنستخدم شئ يسهل علينا الموضوع دا وهو this
    this هى keyword بتعنى reference فلما نستخدمها ونتبعها بإسم field او function فمعناها إننا نقصد المتغير اللى فى ال class مش ال argument
    جميل جدا .. لكننا مازلنا على الورق ومش عملنا لا Objects ولا غيره!
    ماشى افتح ملف ال main.java
    هنعمل Object من ال Human Class بإسم ahmed ونديله القيم
    name = “Ahmed”
    Age = 18
    Height = 180
    عن طريق ال Constructor اللى عرفناه فى ال class
    كود:
            Human ahmed=new Human("Ahmed", 18, 180);
    نستدعى ال methods اللى فيه زى move, drink, sleep 
            ahmed.move();
            ahmed.drink();
            ahmed.sleep();
    ال Output هيكون كالتالى
    Hey, I'm moving!
    I'm Drinking!
    I'm sleeping, BACK OFF!
    طب افرض إنى حبيت اعدل field ايه الحل وكل الfields عندى private ومش ليا Access عليهم ؟
    الحل هو إنك تعتمد إسلوب Java وهو إستخدام ال Getters/Setters وهما Public Methods بيخلوك تتحكم فى ال Fields وتحميها من اى لعب! تابع التالى :
    كود:
    public class Human {
        
        /*Fields*/
        private String name;
        private int age;
        private int height;
        
        
        /*Constructor*/
        public Human(String name, int age, int height){
            this.name=name;
            this.age=age;
            this.height=height;
                   
        }
        
        /*Getters*/
        public  String getName(){
            return this.name;
        }
        
        public int getAge(){
            return this.age;
        }
        
        public int getHeight(){
            return this.height;
        }
        
        /*Setters*/
        public void setName(String name){
            this.name=name;
        }
        
        public void setAge(int age){
            this.age=age;
        }
        
        public void setHeight(int height){
            this.height=height;
        }
        
        
        public void move(){
            System.out.println("Hey, I'm moving!");
        }
        public void sleep(){
            System.out.println("I'm sleeping, BACK OFF!");
        }
        public void eat(){
            System.out.println("I'm eating, join me!");
        }
        public void drink(){
            System.out.println("I'm Drinking!");
        }
    }
    كدا إحنا نقدر نستدعى ال methods التالية عشان نعرف قيمة ال Field
    getName, getAge, getHeight
    ونقدر نستدعى الmethods التالية ونباصى ليها argument من نفس نوع ال field ونعدل ال Field ليها وهى setName, setAge, setHeight
    اكتب التالى فى ال main function
    كود:
     Human ahmed=new Human("Ahmed", 18, 180);
            System.out.println("My Name now is : " + ahmed.getName());
            System.out.println("My Age : "+ahmed.getAge());
            
            ahmed.setName("Youssef"); //Setting the name field to Youssef;
            System.out.println("My Name now is : " + ahmed.getName());
    ال
    Outputهيكون :
    My Name now is : Ahmed
    My Age : 18
    My Name now is : Youssef
    لاحظ إننا عدلنا على ال Name Field بإستخدام ال setter وبنحصل على القيمة بتاعته بإستخدام ال getter
    لكن لاحظ إن اى حد يقدر يضيف قيم غير منطقية مثلا يحط age ب 150 سنة مثلا! او ال Height ب 30 متر :S
    فهنعدل بالطريقة دى
    كود:
    public void setAge(int age){
            if (age <120){
            this.age=age;
        }
       else
            this.age=0;
        }
        public void setHeight(int height){
           if (height>2.5){
               this.height=height;
           }
           else
               this.height=0;
        }
    مجرد هنختبر قيمة ال argument تنفع ولا لأ فلو تنفع يتم التعديل على ال Field لو لأ نخلى القيمة 0 مثلا!

    ال Constants هى قيم مش بتتغير مثلا MAX_AGE يكون 120 سنة ! مش ينفع نعدل عليه فى وسط البرنامج
    ال Inheritance
    الوراثة .. آه ال Classes بتورث بعضها تخيل بقة وتركة وحوارات كدا :D
    الأول على فرض إننا عايزين نعمل Class بيمثل موظف مثلا .. اكيد هتلاحظ إن الموظف دا IS بنى آدم
    فأكيد هنحطله كل ال fields/methods الخاصة بال Human ونضيف عليها بعض ال Fields/methods الخاصة بال Employee زى المرتب وانه يشتغل ويروح الشغل!
    هل هتكتب ال Human Class وتغير الإسم ل Employee وتضيف الزيادة ؟ بأى منطق تكتب 70 سطر مرة تانية!!
    ولا تقول إن ال Employee دا Human ولكن فيه شوية إضافات ؟ YES دا الحل الأمثل !
    انت بتقول كدا باإستخدام extends كالتالى
    كود:
    public class Employee extends Human {
    }
    ال Employee ليه salary اكيد فهنضيف له ال salary و إسم للشركة ك fields
    كود:
       private int salary;
        private String firm;
    وليه بعض الmethods زى إنه يروح للشغل وإنه يشتغل وإنه يترفد كمان هههههههههههه
    كود:
      public int getSalary(){
            return this.salary;
        }
        
        public void setSalary(int salary){
            this.salary=salary;
        }
        
        public String getFirmName(){
            return this.firm;
        }
        
        public void setFirmName(String firm){
            this.firm=firm;
        }
        public void goToWork(){
            System.out.println("I'm going to work!");
        }
        public void work(){
            System.out.println("I'm working right now!");
        }
        public void getFired(){
            System.out.println("I got Fired!");
            this.salary=0;
    }
    لاحظ إنه لما يترفد هنخلى ال salary قيمته 0
    ال Trick هنا فى ال Constructor وانا خليته للآخر عشان مش تتخض :D
    كود:
     public Employee(String name, int age, int height, String firm, int salary) {
            super(name, age, height);
            this.firm=firm;
            this.salary=salary;
        }
    لاحظ شئ ان ال Employee وارث ال Human يعنى لازم يكون ليه name, age, height تمام ؟
    الحاجات اللى تخص ال super اللى هو هنا هيكون ال Human هنباصيها ليه
    كود:
    super(name, age, height);
    الحاجات الخاصة بال Employee وهى ال salary وال firm هنباصيهم لل Fields الخاصة بال Employee بكل بساطة
    كود:
            this.firm=firm;
            this.salary=salary;
    لاحظ شئ إن مش ليك اى Access على ال Fields الخاصة بال Super مع إنك وارثها المفروض ؟
    هقلك آه انت فعلا وارثها ولكن private مش ليك اى Access عليها!
    عشان كدا لو بتصمم class وهتورثه ل class تانى تخلى كل ال Fields بتاعتك Protected !!
    فكدا يكون التصميم النهائى هو
    ال Human Class
    كود:
    public class Human {
        
        /*Fields*/
        protected String name;
        protected int age;
        protected int height;
        
        
        /*Constructor*/
        public Human(String name, int age, int height){
            this.name=name;
            this.age=age;
            this.height=height;
                   
        }
        
        /*Getters*/
        public  String getName(){
            return this.name;
        }
        
        public int getAge(){
            return this.age;
        }
        
        public int getHeight(){
            return this.height;
        }
        
        /*Setters*/
        public void setName(String name){
            this.name=name;
        }
        
        public void setAge(int age){
            if (age <120){
            this.age=age;
        }
            else
                this.age=0;
        }
        public void setHeight(int height){
           if (height>2.5){
               this.height=height;
           }
           else
               this.height=0;
        }
        
        
        public void move(){
            System.out.println("Hey, I'm moving!");
        }
        public void sleep(){
            System.out.println("I'm sleeping, BACK OFF!");
        }
        public void eat(){
            System.out.println("I'm eating, join me!");
        }
        public void drink(){
            System.out.println("I'm Drinking!");
        }
    ال Employee class
    كود:
    public class Employee extends Human {
        
        private int salary;
        private String firm;
        
        
        /** Creates a new instance of Employee */
        public Employee(String name, int age, int height, String firm, int salary) {
            super(name, age, height);
            this.firm=firm;
            this.salary=salary;
        }
        public int getSalary(){
            return this.salary;
        }
        
        public void setSalary(int salary){
            this.salary=salary;
        }
        
        public String getFirmName(){
            return this.firm;
        }
        
        public void setFirmName(String firm){
            this.firm=firm;
        }
        
        public void goToWork(){
            System.out.println("I'm going to work!");
        }
        public void work(){
            System.out.println("I'm working right now!");
        }
        public void getFired(){
            System.out.println("I got Fired!");
            this.salary=0;
            
        }
    }
    نتكلم شوية عن ال Interfaces
    ال Interfaces دا بديل او شبه بديل لعدم إستخدام ال Multiple inheritance فى لغات زى ال C#, Java
    وهى عبارة عن عقد بين ال Interface وال Class .. بتتفق مع ال Class إنك إذا اضفتنى ليك تملى كل اللى جوايا! إزاى انا مش فاهم حاجة :S
    هنشوف حالا
    كود:
    public interface IDraw {
       void draw();
       void draw3D();
       void erase();    
    }
    ال I دى Convention عندى من ال .NET ان اى Interface ابدأها بحرف I
    لاحظ إن ال Interface فيها ال prototypes الخاصة بال methods لكن مش فى implementation !
    هقلك ايوه .. ال Interface مش بيبقة فيها غير ال prototype الخاص بال method وال Implementation عليك فى ال class اللى هيضيفها
    على فرض إن عندنا class إسمه Shape عايزين نضيف فيه ال Idraw Interface هنستخدم implements
    كود:
    public class Shape implements Idraw{
    }
    لو سبت ال Class فاضى زى ماهو دلوقتى هيجيلك Error انك مش عملت Override لل Methods الخاصة بال Interface بمعنى آخر اخليت بالعقد اللى إتفقت عليه مع ال Interface !!
    كود:
        public void draw(){
            System.out.println("IDraw.draw() implementation");
        }
        public void draw3D(){
            System.out.println("IDraw.draw3d() implementation");
        }
        public void erase(){
            System.out.println("IDraw.erase() implementation");
        }
    ال Abstract class
    هو class لكن مش مكتمل وانت ناوى تملاه بعدين فى Inherited Class
    مثلا هنطبق على نفس ال class اللى إستخدمنا فيه ال Idraw Interface على صورة abstract class ونورثه ل Shape2 مثلا

    لاحظ إنك مش تقدر تعمل Object من ال Abstract class لأنه غير مكتمل!
    لاحظ abstract keyword اللى إستخدمناها فى إننا
    1- اعلنا إن ال Class هيكون abstract
    2- اعلنا إن فى methods هنبقة نملاها بعدين .. لأن مش شرط إن كل ال methods تكون abstract!
    كود:
    public abstract class abstractDraw {
       
        public void draw(){
            System.out.println("Drawing!");
        }
        public abstract void draw3D();
        public abstract void erase();
    }
    هنورثه عادى جدا كالتالى
    كود:
    public class Shape2 extends abstractDraw{
        
        
        /** Creates a new instance of Shape2 */
        public Shape2() {
        }
    
        public void draw3D() {
        }
    
        public void erase() {
        }
        
    }
    لاحظ إن الNetBeans بيساعدك فى الحوارات دى يعنى بمجرد دوسك ل Alt-Enter تختار implement abstract methods هو هيكتبهملك
    كود:
    public class Shape2 extends abstractDraw{
        
        /** Creates a new instance of Shape2 */
        public Shape2() {
        }
    
        public void draw3D() {
        }
    
        public void erase() {
        }
        
    }
    إيه الفرق الجوهرى بين ال Abstract Class وال Interface ومين فيهم افضل فى إنى استخدمه ؟
    احد الفروق إنك تقدر تعمل implement لأى method داخل ال Abstract class !
    احد اهم الإختيارات إن ال Class فى Java بيحقله إنه يورث 1 Class واى عدد من ال Interfaces ! فكدا إحسبها كويس .. يعنى بدل ماتستخدم abstract class تقدر تستخدم ال interface وتفضل محتفظ بميزة إنك تقدر تورث class

    Polymorphism
    الكلمة دى بتدايق ناس كتير مع إن مغزاها سهل جدا وبسيط وهو إن يتواجد اشكال عديدة من خلال إسم واحد وهشرحها حالا
    لاحظ المثال التالى
    كود:
    public class Person {
        private String name;
        private int age;
        private int weight;
        /** Creates a new instance of Person */
        public Person() {
            name="";
            age=0;
            weight=0;
        }
        public Person(String name, int weight){
            this.name=name;
            this.weight=weight;
            this.age=20; //Default.
        }
        public Person(String name){
            this.name=name;
            this.weight=70; //Default.
            this.age=20; //Default.
        }
    }
    ملاحظ إن فى 3 Constructor بنفس الإسم ؟ دا المقصود بتعدد الأشكال لإسم واحد
    هنضيف toString method عشان ننجز :D
    كود:
        public String toString(){
            return ("Name : "+this.name + ", Age : "+this.age+ ", Weight : "+this.weight);
        }
    فى ال main function اكتب التالى
    كود:
             Person p1=new Person();
             System.out.println(p1);
             
             Person p2=new Person("Ahmed", 180);
             System.out.println(p2);
             
             Person p3=new Person("Ahmed");
             System.out.println(p3);
    ال output هيكون

    Name : , Age : 0, Weight : 0
    Name : Ahmed, Age : 20, Weight : 180
    Name : Ahmed, Age : 20, Weight : 70
    لاحظ إننا إستخدمنا فى كل مرة Constructor مختلف عن التانى وهو بيسمى Constructor Overloading
    وهى حالة خاصة من ال Functions Overloading .. إنك ممكن تلاقى نفس الإسم ل Function وتلاقيها بتقوم بوظيفة مختلفة .. الإختلاف بيكون فى ال Parameters وال return type .. وال Java is smart enough عشان تعرف اى ميثود إنت بتستدعيها من عدد ال parameters وال return type !
    مثال تانى على ال methods overloading
    كود:
    public class TestClass {
        
        /** Creates a new instance of TestClass */
        public TestClass() {
        }
            
        //First print
        public void Print(String str){
            System.out.println(str);
        }
        //Second print
        public void Print(int i){
            System.out.println(i);
        } 
    }
    لاحظ هنا إن فى 2 Print methods
    الأولى بتاخد String
    التانية بتاخد Integer
    كود:
        TestClass tc=new TestClass();
             tc.Print("Hello");
             tc.Print(59);
    ال output هيكون
    Hello
    59
    الأفضل بالمناسبة إنه يكون static methods بس انا مش شرحت معنى static اصلا فعشان دا خلتنا زى ماحنا
    بالمناسبة ال Overriding لل methods هو إنك تعيد تعريف ال method اللى فى ال super class فى ال sub class مش اكتر!
    http://java.sun.com/docs/books/tutor.../override.html

    EDIT:
    Overriding methods

    هو إنك تعيد تعريف ال method بنفس الإسم فى ال sub class .. تابع المثال التالى
    على فرض إن عندنا class بإسم Animal
    كود:
    public class Animal {
        
        /** Creates a new instance of Animal */
        public Animal() {
        }
        public void sleep(){
            System.out.println("The Animal is sleeping!");
        }
        
    }
    وهنورثه ل Cat class ولكن مش عايزين ال method sleep تقول The Animal عايزنها تقول The Cat مثلا !
    نحددها اكتر لتناسب ال Class الجديد .. فبكل بساطة تعيد تعريفها تانى فى ال sub class
    كود:
    public class Cat extends Animal{
        
        /** Creates a new instance of Cat */
        public Cat() {
        }
        //Override the sleep method.
        public void sleep(){
            System.out.println("The Cat is sleeping!");
        }
    }
    فى ال main
    كود:
         
       Animal animalObj=new Animal();
            
            animalObj.sleep(); //Calling the sleep method in the base.
    هيتم إستدعاء ال sleep method اللى فى ال Parent class
    كود:
            Cat kitty=new Cat(); 
            kitty.sleep();  //Calling the overriden method.
    هنا هيتم إستدعاء ال sleep method اللى فى ال child


    ال Final Classes/ Methods

    ال Final Class او ال Sealed Class لرجالة ال C# هو Class غير قابل إنك تورثه على نفس المثال
    كود:
    public final class Animal {
        
        /** Creates a new instance of Animal */
        public Animal() {
        }
        public void sleep(){
            System.out.println("The Animal is sleeping!");
        }
        
    }
    خلينا ال Animal Class نوعه Final

    وحاولنا نورثه عادى فى ال Sub class
    كود:
    public class Cat extends Animal{
        
        /** Creates a new instance of Cat */
        public Cat() {
        }
        //Override the sleep method.
        public void sleep(){
            System.out.println("The Cat is sleeping!");
        }
    }
    هتلقة Error ظاهرلك او حتى لما تجرب تشغل البرنامج هتلاقى الError وهو
    Cannot inherit from final class

    ال Final methods هى methods فى صورة نهائية ولايمكن عمل Override ليها

    تخيل نفس المثال
    كود:
    public class Animal {
        
        /** Creates a new instance of Animal */
        public Animal() {
        }
        public final void sleep(){
            System.out.println("The Animal is sleeping!");
        }
        
    }
    ولكن اعلنا إن sleep دى هتكون final فمش ممكن نعمل override ليها فى ال sub
    كود:
    public class Cat extends Animal{
        
        /** Creates a new instance of Cat */
        public Cat() {
        }
        //Override the sleep method.
        public void sleep(){
            System.out.println("The Cat is sleeping!");
        }
    }
    حاول تستدعي ال sleep من ال sub class
    هيكون الError هو محاولة ال Override لل final method!

    توضيح : انا كنت ناوى اعملها توتريل فى ال جافا فبدأت ب Hello, World لكن فوجئت إنى مش قدامى وقت فقلت اشرح الأهم وبعدين الباقى بسيط شوية Loops وبتاع :D
    المهم اتمنى ان الشرح يكون واضح .. واى إستفسارات -إذا كنت موجود- هكون سعيد بالإجابة عنها ان شاء الله
    CIAO
    التعديل الأخير تم بواسطة StrikerX; الساعة 29-09-2007, 09:22 PM. سبب آخر: إضافة ال final Classes/methods وال Overriding methods.
    Programming-Fr34ks[dot]NET
    Ma Weblog
    ابدأ بتعلم Python | Ruby
    كتاب البايثون متوافر الآن
    لا اتواجد بهذا المنتدى ... للإتصال

  • #2
    السلام عليكم ورحمة الله وبركاته

    بسم الله ماشاء الله على الشرح البسيط السهل وبارك الله فيك يا أخى وننتظر المزيد ،
    وعندى سؤال : أنا مبرمج بلغة السى شارب وأريد تعلم لغة الجافا ، فهل الجافا أقوى وبأى نصيحة تنصحنى إذا أردت تعلم الجافا
    لا إله إلا أنت سبحانك إنى كنت من الظالمين
    http://counter.li.org/cgi-bin/certificate.cgi/462599

    تعليق


    • #3
      مقـال روعـه يا احمـد وشغـل جـامد جـدا

      تعليق


      • #4
        نورتم ياجماعة
        وعندى سؤال : أنا مبرمج بلغة السى شارب وأريد تعلم لغة الجافا ، فهل الجافا أقوى وبأى نصيحة تنصحنى إذا أردت تعلم الجافا
        إنت عندك كل المفاهيم الخاصة بال OOP كويس فى الشارب ولكن لما تيجى تتعلم Java هتنسى كلمة Properties و تتستخدم ال Getters/Setters وشوية حاجات كدا بسيطة هتتعدل زى base و sealed ..
        ومش هتتعامل مع ال .NET namespaces !

        لكن الإنتقال بصورة عامة ممكن ياخد منك حوالى إسبوع إذا كنت كويس فى ال C# .
        بالمناسبة انا مش هتكلم فى موضوع القوة عشان مش ابدأ flame war هنا :p
        التعديل الأخير تم بواسطة StrikerX; الساعة 29-09-2007, 09:23 PM.
        Programming-Fr34ks[dot]NET
        Ma Weblog
        ابدأ بتعلم Python | Ruby
        كتاب البايثون متوافر الآن
        لا اتواجد بهذا المنتدى ... للإتصال

        تعليق


        • #5
          حلو ياسترايكر .. الصراحه موضوع دسم وحلو .. وجاء في وقته لاني راح ابدا بتعلم الجافا هاليومين .. الموضوع مفهوم جدا ً مع اني ماعمري كتبت حتى كود Hello, World في الجافا .. لكن فهمت الجزئية الاولى في الموضوع ولم اواجه اي صعوبه ..
          الـ Interfaces مااعجبتني يمكن لاني ماعمري فهمتها :D على العموم الموضوع راح يكون مرجع عندي ..

          thanks .
          Macbook Air: OS X 10.9.2 + Kali Linux 1.0.6

          تعليق


          • #6
            رائع ياسترايكر

            انا لسى بدأت ال Oop بالجامعه على السمول توك والجافا بالترم الثاني

            تعليق


            • #7
              تم إضافة جزئيتين وقعو منى صراحة إمبارح لأنى مش كنت شايف قدامى .. ال Final Classes/Methods وال Overriding methods

              المشاركة الأصلية بواسطة snix مشاهدة المشاركة
              حلو ياسترايكر .. الصراحه موضوع دسم وحلو .. وجاء في وقته لاني راح ابدا بتعلم الجافا هاليومين .. الموضوع مفهوم جدا ً مع اني ماعمري كتبت حتى كود Hello, World في الجافا .. لكن فهمت الجزئية الاولى في الموضوع ولم اواجه اي صعوبه ..
              الـ Interfaces مااعجبتني يمكن لاني ماعمري فهمتها :D على العموم الموضوع راح يكون مرجع عندي ..
              thanks .
              منور ياسامى .. بخصوص ال Interfaces تقدر تعتبرها صورة خاصة من Abstract Class وكل الmethods اللى فيه Abstract methods

              وربنا يوفقك فى ال Java .. وإذا مش هضمت موضوع ال Interfaces كويس يبقة فكر فى اى لغة بتدعم ال Multiple inheritance زى ال C++ او Python
              المشاركة الأصلية بواسطة عبد العزيز مشاهدة المشاركة
              رائع ياسترايكر

              انا لسى بدأت ال Oop بالجامعه على السمول توك والجافا بالترم الثاني
              عزوز .. ربنا معاك وإذا احتجت شئ إن شاء الله موجودين
              Programming-Fr34ks[dot]NET
              Ma Weblog
              ابدأ بتعلم Python | Ruby
              كتاب البايثون متوافر الآن
              لا اتواجد بهذا المنتدى ... للإتصال

              تعليق


              • #8
                مشكور اخوي سترايكر ،،


                درس مفيد جدا ،،

                الى اللقاء ،،

                تعليق


                • #9
                  المشاركة الأصلية بواسطة SudaNix مشاهدة المشاركة
                  مشكور اخوي سترايكر ،،


                  درس مفيد جدا ،،

                  الى اللقاء ،،
                  العفو ياSudaNix
                  نورت
                  Programming-Fr34ks[dot]NET
                  Ma Weblog
                  ابدأ بتعلم Python | Ruby
                  كتاب البايثون متوافر الآن
                  لا اتواجد بهذا المنتدى ... للإتصال

                  تعليق


                  • #10
                    كح ايه رأيك في البشاعه الي انا عاملها ديت
                    كود PHP:

                    public class Programmer {

                        private 
                    String _Name;
                        private 
                    String _Music;
                        private 
                    String _Lang;
                        private 
                    int _id;
                        private static 
                    int UID 0;
                            
                        
                    Programmer()
                        {
                            
                    _id UID++; // Starts From 0
                        
                    }
                        
                        public 
                    int GetId()
                        {
                            return 
                    _id;
                            
                        }
                        public 
                    void SetName(String Name)
                        {
                            
                    _Name Name;
                            
                        }
                        public 
                    void SetMusic(String Music)
                        {
                            
                    _Music Music;
                            
                        }
                        public 
                    void SetLang(String Lang)
                        {
                            
                    _Lang Lang;
                        }
                        
                        public 
                    String GetName()
                        {
                            return 
                    _Name;
                        }
                        public 
                    String GetMusic()
                        {
                            return 
                    _Music;
                        }
                        public 
                    String GetLang()
                        {
                            return 
                    _Lang;
                        }
                        


                    كود PHP:
                    public class Main {

                        public static 
                    void main(String[] args) {
                        
                            
                    Storm ME = new Storm();
                            
                    Striker Friend = new Striker();
                            
                            
                    System.out.println("Name Is :" ME.GetName());
                            
                    System.out.println("Id is : " ME.GetId());
                            
                    System.out.println("Programming Language is " ME.GetLang());
                            
                    System.out.println("My Fav music is "ME.GetMusic());
                            
                            
                    ME.LovesTo();
                            
                    Friend.LovesTo();
                            
                            
                        }


                    كود PHP:
                    public class Storm extends Programmer {

                        
                    Storm()
                        {
                            
                    SetName("St0rM-MaN");
                            
                    SetMusic("Metal , Hard Rock , Rock");
                            
                    SetLang("C/C++ , Java");
                        }
                        
                        
                    /* Storm's Only */
                        
                    public void LovesTo()
                        {
                            
                    System.out.println("Fuck People Minds");
                            
                    System.out.println("Storm Is EVIL");
                            
                    System.out.println("Love White Chix");
                        }
                            
                        } 
                    كود PHP:
                    public class Striker extends Programmer {

                        
                    Striker()
                        {
                            
                    SetName("Striker -- The Melon");
                            
                    SetMusic("Soft , Classic ");
                            
                    SetLang("Py , .NET , java");
                        }
                        
                        public 
                    void LovesTo()
                        {
                            
                    System.out.println("Print His Information :P");
                            
                    DisplayInfo();
                        }
                        private 
                    void DisplayInfo()
                        {
                            
                    System.out.println("Name Is :" GetName());
                            
                    System.out.println("Id is : " GetId());
                            
                    System.out.println("Programming Language is " GetLang());
                            
                    System.out.println("My Fav music is "GetMusic());
                        }

                    BOOOF , I AM GONE
                    Still , you gotta wait for my PRESENT :D
                    C programming arabic Tutorial|Programming-fr34ks

                    تعليق


                    • #11
                      تصدق بالله مش كنت واخد بالى لكن فعلا دا اسوء coding style شفته بالجافا ياأخى والله فضلت متحير ايه اللغة اللى كتبها دى

                      حلو ياعم احمد ولكن عايز اعورك انا بصراحة ههههههههههههههههههه
                      لو بصيت فى ال 2 classes اللى هما Storm, Striker هتلقة الإتنين شبه واحد معدا ال data اللى موجودة فى كل منهم فمش كان فى داعى انك تعمل extend لكل واحد فيهم بالعكس بما إنهم واحد يبقة تعمل اوبجكتس وتعدل فى الdata بس
                      بص كدا عشان بردو اثبت الموضوع شوية

                      عندنا Class وليكن Human كالتالى
                      كود:
                      public class Human {
                          private String name;
                          private int    age;
                          private char   sex;
                          
                          public Human(){
                              
                          }
                          public Human(String name, int age, char sex){
                              this.name=name;
                              this.sex=sex;
                              this.age=age;    
                          }
                          
                          //Getters..
                          public String getName(){
                              return this.name;
                          }
                          
                          public int getAge(){
                              return this.age;
                          }
                          
                          public char getSex(){
                              return this.sex;
                          }
                          //Setters..
                          public void setName(String newName){
                              this.name=newName;
                          }
                      ال Class دا لاحظ إن ال fields بتوعه private (الأصح انى اخليها protected ) عشان اسمح لأى حد هيعمله extend بال direct access ولكن انا قررت اسمحله انه يتعامل معاها بال getters/setters
                      طبعا لازم تخلى بالك من ال Exceptions اللى عايز تراعيها زى UnknownSexException مثلا -ولكن سيبنا منها الوقتى-

                      نيجى بقة لل Programmer Class .. المفروض لو هتقسمه يبقة مثلا cute زيى و ugly زيك

                      المهم هنستخدم ال Class اللى فات كالتالى
                      كود:
                      public class Programmer extends Human{
                          //Specialized fields..
                          private String favLang;
                          private String music;
                          private int myID;
                          private static int id;
                          
                          
                          //Constructor..
                          public Programmer(String name, int age, char sex, String lang, String music) {
                      
                              super(name, age,  sex);
                              this.favLang=lang;
                              //new programmer is aliveeeeee
                              this.music=music;
                              
                              //Programmer.id is already set to its default value (Zero)
                              myID=++Programmer.id; //use class ref as it is a static field.
                              //or myID=Programmer.id+1;
                             }
                        
                          
                          //Getters.
                          public String getFavLang(){
                              return this.favLang;
                          }
                          public String getMusic(){
                              return this.music;
                          }
                          public int getID(){
                              //Get MyID...
                              return this.myID;
                          }
                          public static int getNumOfProgrammers(){
                              return Programmer.id;
                          }
                          
                          //Setters
                          public void setFavLang(String lang){
                              this.favLang=lang;
                          }
                          
                          public void setMusic(String music){
                              this.music=music;
                          }
                          
                          @Override
                          public String toString(){
                              String sb="";
                              sb += "Name: "+ this.getName();
                              sb += "\nAge: "+ this.getAge();
                              sb += "\n----------------\n";
                              sb += "\nID: "+ this.getID();
                              sb += "\nLang: "+ this.getFavLang();
                              sb += "\nMusic: "+ this.getMusic();
                              
                              return sb;
                          }
                          
                      
                      }
                      وفى ال entry point
                      كود:
                          public static void main(String[] args) {
                              // TODO code application logic here
                              Programmer striky=new Programmer("Ahmed", 19, 'm', "Python", "Rock");
                              System.out.println(striky);
                              Programmer stormy=new Programmer("Ahmed", 10, 'm', "C", "Rock");
                              System.out.println(stormy);
                              
                          }
                      وبس كدا ياحج .. عايزين وحش فى ال OOP كدا
                      Programming-Fr34ks[dot]NET
                      Ma Weblog
                      ابدأ بتعلم Python | Ruby
                      كتاب البايثون متوافر الآن
                      لا اتواجد بهذا المنتدى ... للإتصال

                      تعليق


                      • #12
                        محسسني اني قولتلك اني عملت صرح عظيم وعايزك تديني رأيك
                        رأيك مهم بس انا قولت ايه رأيك في البشاعه مش في حاجه تاني لا سمح الله

                        وانا ugly ؟؟؟ يابني دانا السنه الي فاتت اتحجزت في مكتبة الاسكندريه السائحين مش راضين يمشوا غير اما يشوفوني ويشوفوا حلاوتي ناس غريبه
                        BOOOF , I AM GONE
                        Still , you gotta wait for my PRESENT :D
                        C programming arabic Tutorial|Programming-fr34ks

                        تعليق


                        • #13
                          هههههههههههههههههههههه مشوار الألف OOP يبدأ بكام كلاس وشوية انترفيسيز وكدا

                          انت هتشتغلنى هما حجزوك عشان اشتباه فى واحد إرهابى :D ال حلاوتك ال
                          تعيش وتتقبض عليك :D
                          Programming-Fr34ks[dot]NET
                          Ma Weblog
                          ابدأ بتعلم Python | Ruby
                          كتاب البايثون متوافر الآن
                          لا اتواجد بهذا المنتدى ... للإتصال

                          تعليق


                          • #14
                            حاولت كتير أتعلم الOOP بواسطة C++ بس دايماً بكرهها وأرجع للC
                            مع أني أستخدمها دايماً في pythonإجباري ادعولي شي يوم أحبها أو أتعلمها

                            مشكور جداً
                            ومن علم - رحمك الله - أن كلامه من عمله قلَّ إلا فيما ينفعه ومن أيقن أنه مسؤولٌ عما ألف وعما كتب لم يعمل الشيء وضدّه ولم يستفرغ مجهوده في تثبيت الباطل عنده وأنشدني الرِّياشي: ولا تكتب بخطك غير شيء ... يَسرك في القيامة أن تراه. [ابن قتيبة]

                            تعليق


                            • #15
                              ما شاء الله عليك يا ستورم ،،
                              دخلت عالم ال OOP

                              لكن شايفك لسه متأثر بسي خاصة في اسامي المتغيرات _id ههههههههههه
                              تحياتي وان شاء الله نشوفك OOP Master

                              +++++++++++++
                              تصدق بالله مش كنت واخد بالى لكن فعلا دا اسوء coding style شفته بالجافا ياأخى والله فضلت متحير ايه اللغة اللى كتبها دى
                              هههههههههههه مشكل
                              سي+جافا+system call


                              ChArLoK_16:
                              هذا الزمن لازم نتعلم ال OOP ،، على الاقل لكي نجلب $$
                              وانا في بدايتي مع سي++ ،، كنت قد قررت ان لا اتعلم OOP ، ولكن بعد فترة وجدت نفسي انا الخسران
                              لان كل شيء حاليا يعتمد عليه ،، اللهم الا ال O.S و Device driver وبعض ال utilities
                              وبالتوفيق ان شاء الله ،،

                              تحياتي للجميع ،،

                              تعليق

                              يعمل...
                              X