Hi everyone and welcome to Upna College और आज के वीडियो में हम पढ़ने वाले हैं OOPS के बारे में यानि Object Oriented Programming Systems जानेंगे इस क्लास में कि Classes क्या होती हैं, Objects क्या होती हैं अभी तक हम जो Code लिखते आ रहे थे Main Function में उसका क्या मतलब था साथ के साथ Inheritance, Encapsulation, Polymorphism और Abstraction जैसे Concepts के बारे में पढ़ेंगे अब OOPS को पढ़ना Important दो Reasons की वज़े से हैं सबसे पहला यह कि आजकल modern programming languages जो हैं वो सारी OOPS के concepts पर based हैं इसलिए हमें जानना बहुत जरूरी है कि OOPS काम कैसे करता है ताकि अगर एक language से दूसरी object oriented language में shift हो तो concepts हमारे जो हैं वो course है काफी clear हो दूसरा reason यह कि placements में जब भी हम बैठते हैं तो interviewer हमसे OOPS के concepts के बारे में सवाल पूछ लेते हैं इसलिए हमें जानना जरूरी है उन concepts के बारे में हमें पता हो कि उन्हें apply कैसे करना है क्योंकि कभी written में वो हमसे code लिखवा कर देख लेते हैं कि OOPS के इस concept को implement करके एक code लिखी है यह Java के अंदर भी होता है, C++ के भी अंदर होता है, इसलिए हमारे concepts काफी अच्छे होने चाहिए अब class की शुरुवात करते हैं और lecture के notes आपको नीचे description box के अंदर मिल रहे होंगे जिसमें Java OOPS prescribed है, अगर आपको C++ OOPS चाहिए तो उसके लिए भी हमने already lecture के notes डाले हुए एक separate video में तो वो आप जाकर देख सकते हैं इससे पहले Java के हम 15 concepts पढ़ चुके हैं 15 different videos में इस video में हम cover करेंगे पूरा का पूरा उप्स शुरुआत करते हैं अपनी class की classes and objects के साथ अब बात करेंगे अगर classes and objects की तो classes and objects को programming में इसलिए introduce किया गया था ताकि हम real world problems को coding के थूँ, programming के थूँ solve कर सकें अब अगर example लें Maruti 800 का तो Maruti 800 को बनाने से पहले सबसे पहले उसका एक blueprint बनाया गया होगा फिर वो factory वालों को दिया गया होगा, उसके हिसाब से सब कुछ setup हुआ होगा, और फिर सारी की सारी गाडियां जो आई, वो उस blueprint के हिसाब से आई, तो classes and objects की अगर बात करें, तो object हो गई हर एक गाडि, जो उस Maruti के factory से निकली, और blueprint जो था, वो हो गई हमारी class, तो programming के अंदर कोई भी चीज वर्ल्ड के अंदर अगर हमें प्रोग्रामिंग के अंदर लेकर आनी है तो उसको हम एक ओब्जेक्ट बना सकते हैं और उस ओब्जेक्ट को बनाने की जो इंस्ट्रक्शन्स होती है कि उसके अंदर क्या-क्या प्रॉपर्टीज होगी वह क्या-क्या एक्शन परफॉर्म कर सकती है ओब्जेक्ट वह क्या-क्या चीजें कर सकती है वह सारा का सारा ब्लूप्रिंट एक क्लास के अंदर लिखा होता है तो यह मोटा-मोटी मतलब होता है क्लास का और ओब्जेक्ट का अब ए डिफरेंट हमारे पास पेंज अगर दिए हो तो उनको डिस्टिंग्विश कैसे करेंगे उनको अलग-अलग कैसे समझेंगे उनको समझेंगे अलग-अलग उनके कलर के हिसाब से मान लीजिए एक पेन है रेड कलर का एक पेन है ब्लू कलर का एक पेन है ब्लाक कलर का तो अब फाइल का नाम है oops.java तो इसके अंदर एक public class बन सकती है called oops, अब यहाँ पर बात करें तो हमने public class oops जो है उसको define कर लिया है, इसके अलावा हम मान लेते हैं हमें एक और class बनानी है, और इस class का नाम हम देंगे pen, तो pen class हमने बना ली, अब यह जो pen class है इसमें हम blueprint define करेंगे, किसक कि पहली प्रॉपर्टी जो एक पेंड के अंदर हो सकती है वह हो सकता है उसका कलर हमने डिफाइन कर दिया स्ट्रिंग कलर उसके अलावा उसका ब्रांड भी हो सकता है या उसका टाइप भी हो सकता है तो एक स्ट्रिंग ले जाते हैं जिसमें लिखेंगे ताइप अब यह टाइप क्या हो सकता है या तो वह बॉलपॉइंट पेन हो सकता है या फिर वह चेल पेन हो सकता है तो यह दोनों टाइप समय कंसिडर किए ब्रांड कॉबी के लिए रहने देते हैं तो यह दोनों properties हमने define कर दी अपने blueprint के अंदर pen को बनाने के लिए अब इसके अलावा pen से हम कोई function perform कर सकते हैं right जैसे pen का काम होता है लिखना तो function perform होगा लिखना तो जो functions जिन methods के बारे में हमने पहले बात की थी उनको हम यहाँ पर implement कर रहे हैं तो हर class के अंदर कुछ methods भी हम लिख सकते हैं तो functions जो class के अंदर define होते हैं उनको हम methods कहते हैं तो यहाँ पर एक function लिख देंगे public वाइड, function क्या कर रहा है, function कर रहा है write, तो यहां लिख देते है system.out.println, writing, कि समथिंग तो इस तरीके से हमने क्लास बना लिए मतलब एक ब्लूपरिंट बना लिया पैन का इस पैन के ब्लूपरिंट में हमारे पास कलर है उस पैन का टाइप है और एक फंक्शन है जो पैन परफॉर्म करता है विच इस टू राइट समथिंग तो वह कुछ लिख देता है अब हमने सिर्फ ब्लूपरिंट बनाया है हमने अभी अरुति 800 को बनाकर शोरूम से बाहर नहीं निकाला अभी हम क्या करेंगे अब हम बनाएंगे ऑब्जेक्ट अब वो हम बनाने वाले हैं अपने main function के अंदर तो हमारा जो main function है वो आता है हमारी public class के अंदर ये pen वाली class अलग है और ये है हमारी public class उपस इसके अंदर लिखेंगे अपना main function public static void main जो java के अंदर एक string of arguments लेता है अब इस main function के अंदर हम अपनी पहली object बनाने वाले हैं pen की उसको कुछ इस तरीके से बनाएंगे pen यानि उसका type क्या होगा, उसका type होगा class का नाम, मतलब pen, और pen1 उसको हमने नाम दे दिया है, is equal to new pen, ये हो गए function जैसे दो parenthesis, तो इस तरीके से हमने एक pen को बना लिया, अब इस pen के लिए हमें color और इसका type define करना है, तो मान लेते हैं ये एक blue pen है और gel pen है, तो pen के लिए color अगर तो सारी की सारी जो properties होती हैं यानि हमने एक object बनाया अब उसकी property क्या होगी उसका color property होगी उसका type property होगी अगर हम कुछ और बनाते तो उसकी भी कुछ-कुछ properties होती है तो properties को access कैसे करना है उसको use कैसे करना है dot लगा कर तो pen1. उसका color is equal to blue इस तरीके से हमने pen1 को color दे दिया blue और अब उसको अगर हमें type देना हो इस इकुल टू जेल तो इस तरीके से हमने पेन को कलर दे दिया उसको टाइट दे दिया अब मान लीजिए इस पेन से हमें कुछ लिखना है अब प्रॉपर्टीज को तो हमने यूज कर लिया था डॉट लगाकर अब इस मेथड को कैसे कॉल करें मतलब इसको कैसे पड़ेगा तो डॉट लगाने से क्या होगा हम कॉल करते हैं पेन वन से हमें लिखना है तो डॉट राइट अ कुछ इस तरीके से हमने पूरा का पूरा code एक लिख लिया है अब इसको save करते हैं और एक बार इसको run करके देखते हैं कि actually output क्या produce होगा तो हमारे पास जो output निकल कर आया है उसके अंदर print हुआ है write something यानि क्या हुआ सबसे पहले तो blue color उसको assign हुआ फिर gel उसका type assign हुआ फिर ये write function call हुआ dot की help से और उसके बाद ये system.out.println वाली line call हुआ तो कुछ इस तरीके से हमारे classes and objects काम करते हैं हर एक object के पास उसकी कुछ properties होती हैं और उसके कुछ methods होते हैं, यह properties होती हैं, यही जैसे color हो गया, type हो गया, इस तरीके की चीज़ें जो उसके साथ associated होती हैं, साथ में होते हैं methods, तो इनको कहते हैं हमें class के data और members, data और members यानि कि data जो भी उसमें stored हो रहा है, यानि string, int टाइ� अब अगर हमें इस pen के लिए उसका color और उसका type अगर print करवाना है तो एक और method देखते हैं class के अंदर public void print color और यहाँ पर हम लिखेंगे this.color अब ये this क्या होता है this actually java का एक keyword है अब इस print color function को जो भी object call कर रही होगी उसका यह color print करवा देगा, और this क्या बताएगा, this इस function को बताएगा, कि इस function को किस object ने call किया है, अब जैसे अभी तो हमने सिर्फ एक ही color लिया था, एक ही pen लिया था, अब हम क्या करते हैं, एक और pen create करते हैं, तो pen2 हमने create किया, जिसको नाम देंगे new pen, और इस new pen में हम color assign कर बॉल पॉइंट एंड अब क्या करते हैं पेन वन के लिए प्रिंट कलर कॉल करते हैं और पेन टू के लिए प्रिंट कलर कॉल करते हैं तो पहली बार अगर हमने प्रिंट वन कॉल किया पेन वन के लिए तो प्रिंट कलर में इस दिस कीवर्ड कॉल किया है पेन वन ने फिर दुबारा से प्रिंट कलर कॉल होगा जब पेन टू से अ तब प्रिंट कालर को पता चलेगा कि उसे pen2 ने call किया है। इसलिए this हमें किसी भी method के अंदर कहीं भी scope में बताता है कि उस method को उस जगे को कौन सी object access करने की कोशिश कर रही है। अब इस code को भी एक बार run करते हैं, run करने से सबसे पहले print होगा pen1 का color, फिर print होगा pen2 का color, pen1 का color है blue, pen2 का color है black, तो ये हमने पढ़ लिया कि objects क्या होती हैं, साथ के साथ classes क्या होती हैं, और this keyword किसले use होता है जावा के अंदर, अब एक और example लेकर देखते हैं, इस बार example लेंगे student का, तो class बनाएंगे एक और class, जिसको नाम देंगे class student, अब एक चीज हमें ध्यान देनी है जब भी हम क्लास बना रहे हैं तो यहाँ पर क्लास कीवर्ड उसको बनाने से पहले हम इन लिखना पड़ता है तो यह syntax होता है क्लास बनाने का जो हम शुरुवात से जावा के अंदर देखते आ रहे हैं दूसरा classes के जो नाम होते हैं हमने पहले ही discuss कर रखा है वो capital letters से शुरु होते हैं by convention ऐसा होता है तो by convention जावा के अंदर classes के नाम capital letters से शुरु होते हैं functions के नाम by convention small letters से शुरु होते हैं तो class बना रहे हैं student इसके अंदर एक student के पास क्या-क्या properties हो सकती हैं सबसे पहले हो सकता है उसका कोई नाम उसके अलावा उसकी कोई age हमारे पास हो सकती है अब इस student class के अंदर कुछ function बनाते हैं function बनाते हैं इस नाम को print करने का तो public void print name this.name साथ के साथ अगर हमें age भी print करनी है तो इसको प्रिंट इनफो नाम दे देते हैं, this.age, तो इस तरीके से हमने student class बना लिए हैं, अब अपने main function के अंदर क्या करेंगे, pens को हम हटा दे दे, यहाँ पर बनाते हैं student, तो student s1 is equal to new student, अब s1.name, अमन अगर हम ले ले, और s1.a is equal to 24, अब क्या करेंगे, s1.printinfo, printinfo किया, save किया अपनी file को, and इसको run करेंगे, तो अब हमारे पास साली information print हो जाएगी, तो यह हमारे पास दोनों information print हो गई, अब दुबारा से कुछ-कुछ changes करेंगे, same के अंदर, save करके run करेंगे, तो दुबारा से हमारे पास updated information print हो गई, तो इस तरीके से classes and objects का हमने base बना लिया है, अब ध्यान दे अगर अपनी चोटी सी line पर, यहाँ पर लिखा है student s1 is equal to new student, इस line को हम ध्यान से देखने वाले हैं, यहाँ पर new एक keyword है जिसके बारे में पहले भी बात कर चुके, जैसे ही new हमारी पूरी की पूरी object जाकर store हो जाएगी तो वो जगए हमने object के साब से allocate कर दिये और यहाँ पर यह जो student और parenthesis है इस पूरी word को, इस keyword को student उसके साथ parenthesis अब सोचा जाए तो parenthesis लगते हैं जहाँ पर function आता है तो यह भी java के अंदर एक function ही है यह एक special type का function है जिसको नाम देते है constructors अब constructors नाम का मतलब क्या होता है कुछ construct करना, कुछ बनाना तो जावा के अंदर Constructors का काम होता है जावा की Objects को Construct करना, उनको बनाना, अब जावा के अंदर Constructors तीन टाइप के होते हैं, यानि Objects को तीन तरीके से हम बना सकते हैं, पहले टाइप के Constructors होते हैं Non-Parameterized Constructors, वो Functions जिनके अंदर Parameters नहीं होते हैं, अब Constructor को लि सबसे पहला एक object का जो constructor होगा या एक class का जो constructor होगा उसका same नाम होगा जो class का नाम होगा यानि constructor का नाम और class का नाम same होता है अगर हम student class का constructor बनाएं तो उसका नाम भी student होगा दूसरी चीज़ यह constructors कुछ return नहीं करते construction methods ही होते हैं functions ही होते हैं पर वो कुछ return नहीं करते उनके ऊपर कोई return type नहीं लिखा जाता, वो बस objects को construct करने का काम करते हैं, और तीसरी property यह होती है, कि एक object हेले constructor सिर्फ एक ही बार call हो सकता है, जैसे normal functions, normal methods को कोई object बार call कर सकती है, हम भी बिना object के भी जो normal functions मिलाते हैं, तो उनको बार call कर सकते हैं, लेकिन अब पहले टाइप के कंस्ट्रक्टर की बात करें यानि नॉन पारमेटराइस कंस्ट्रक्टर की बात करें तो उसको हम कैसे बनाते हैं जैसे स्टूडेंट क्लास के लिए हमें अगर कंस्ट्रक्टर बनाना है तो हम सबसे पहले लिखेंगे स्टूडेंट अब काईदे से यहा और यहाँ पर हम कोई भी statement लिख सकते हैं जैसे यहाँ पर हमने लिख दिया constructor called तो इस तरीके से हमने पूरा constructor बना दिया है और जब भी ये object बनेगी अब तो ये constructor जो है वो call हो रहा होगा और हमारे पास ये statement print हो जाएगी एक बार run करके देखते हैं अपने code को तो constructor called सबसे पह उसके बाद बाकी के code जो है वो run किया, अब हम अगर सोचें कि constructor पहले तो हमने बनाया नहीं था, इसको हमने delete कर दिया था, तब भी हमारा code run कर रहा था, तो वो कैसे run कर रहा था, तो actually Java के अंदर ��गर हम खुद से कोई non-parameterized constructor नहीं लिखते class के अंदर, तो Java by default automatically खुद से constructor अब second type of constructor की बात करें तो वो है parameterized constructor, अब जैसे normal constructor के अंदर अगर हम parameters लेने शुरू करें, यानि यहाँ पर हम नाम भी ले ले, और age भी ले ले, तो हम क्या कर सकते हैं, constructor में initialization खुद से कर सकते हैं, यानि यहाँ से ये दोनो statement हटा के, हम यहाँ लिख सकते हैं, this.name is equal to name, यहा यह परमीटर जो पास हुआ है इसलिए एक डिफरेंस है उसके साथ अगर लिखें दिस डॉट एज तो उसको लिख सकते हैं इज इकुल टू एज यहां दिस डॉट एज है ओब्जेक्ट की एज और यह एज है यह वाला हमारा आर्ग्यूमेंट जो फंक्शन के अंदर कं तो नाम हम पास कर देते हैं, अमन एज हम पास कर देते हैं, 24, और उसके बाद print information call कर देंगे, तो इसको एक बार run करते हैं, run करते ही हमारे पास आ गया है क्या, सबसे पहले आ गया है नाम, उसके बाद आ गयी है एज, तो हमने क्या देखा, कि parameterized constructor में parameters हमने पास कर दिये, और अब तीसरे type of constructors होते हैं copy constructors, C++ से एक concept आया है, C++ के अंदर copy constructors होते हैं, जो by default भी बन जाते हैं, user को भी define करने पड़ते हैं, लेकिन Java के अंदर सारे copy constructors जो होते हैं, वो user redefine करते हैं, copy constructor का simple काम होता है कि एक object को copy करके दूसरे object में डाल देना, जैसे, अगर मान लीजे यहा यहाँ पर हमारे पास आया होता एक दूसरा student, दूसरा student जिसको हम नाम देते S2, अब student आया S2 और हमने क्या किया, जिस भी object के लिए constructor call हुआ, उसके this.name में S2.name store कर दिया, और this.age में S2.age हमने store कर दिया, तो यह जो constructor है, इसको हम copy constructor कह देंगे, क्योंकि यह student 2 की सारी information को copy करक इसको करके देखते हैं एक बार, तो student 1 से अब यह information यहां से हटा देते हैं, क्योंकि हमने वो constructor हटा दिया है, s1.name को हम लिख देते हैं amant, s1.age को हम लिख देते हैं 24, अब क्या करेंगे, एक और student बनाएंगे, student s2, new student, अब इसके अंदर pass करेंगे हमारा s1, है और फिर ऐसे दूं की इंफरमेशन को प्रिंट करेंगे साथ के साथ अगर हमने कॉपी कंस्ट्रक्टर डिफाइंग किया है तो उससे पहले हमें इसको भी कॉल जो है उसको सफिशन कराना पड़ा अगर हमने कॉपी कंस्ट्रक्टर डिफाइंग किया टूडेंट एक सिंपल खाली कंस्ट्रक्टर हमने डिफाइंग कर दिया अब इसको सेव करके अगर रन करें तो हमारे पास आउटपुट में आया अमन और 24 और अपने code में अगर ध्यान से देखे तो S2 के लिए तो हमने कभी properties define ही नहीं करी, हमने directly क्या किया S1 की properties को S2 को assign कर दिया, तो इसी तरीके से अगर हमें objects की copy बनानी होती है, तो हम कुछ इस तरीके से constructor बना लेते हैं, उसके अंदर object पास कर लेते हैं, और वो copy कर देता है सार चार major concepts होते हैं, पहला abstraction, encapsulation, फिर inheritance, और उसके बाद हमारा polymorphism, अब इन चारो concepts को हमें ध्यान से पढ़ना है, हम किसी भी object oriented language की बात करें, ये चारो concept उसके अंदर आते ही हैं, और एक बार हमने चारो concept समझ लिये, तो चाहे हम Java से C++ में switch कर रहे हैं, अब जिस तरह किसे world में balance होता है, वैसे Java के अंदर भी balance होता है, मतलब जो object create हुई है उसको destroy करने के लिए भी कोई mechanism होगा जैसे constructors होते हैं वैसे destructors भी होते हैं क्योंकि programmers बहुत smart हैं और C++ के अंदर तो जैसे हम constructors लिखते हैं वैसे हम एक और function लिख सकते हैं destructor नाम से लेकिन Java के अंदर ये mechanism automatic होता है Java के अंदर automatic garbage collector होता है garbage collector क्या करता है जो object use नहीं हो रही है जो variable use नहीं हो रहा है जो memory बस खा रहा है उसको automatically delete कर देता है तो काफी intelligent तरीके से वो detect करता है कि क्या ये object use हो रही है कहीं हो और code में अगर नहीं हो रही तो उसको automatically delete कर देता है इसलिए हमें खुद से classes के अंदर destructor लिखने की ज़रूरत ही नहीं पड़ती इसलिए Java काफी efficient language है हमारा काम बहुत कम कर देती है तो जब भी Java के अंदर आप से कोई पूछे कि destructors कैसे लिखते हैं तो Java में destructors नहीं लिखते है क्योंकि Java के अंदर होता है garbage collector अब जिस concept को हम discuss करने वाले है उसका नाम है polymorphism polymorphism दो शब्दों से मिलकर बना है पॉली और मॉर्फिजम पॉली यानी मैनी बहुत ज्यादा है मॉर्फिजम यानी फॉर्म्स जब हम एक ही काम को अलग-अलग तरीके से जावा के अंदर करते हैं तो उसको हम कह देते हैं पॉली मॉर्फिजम अब पॉली मॉर्फिजम के दो टाइप्स होते हैं पहला होता है फंक्शन ओवरलोडिंग दूसरा होता है फंक्शन ओवर राइडिंग पहला टाइप रन टाइम पॉलीमोर्फिजम पहला टाइप कंपाइल रन टाइम पॉलिमोर्फिजम को जब इनहेरेटेंस नाम का टॉपिक पढ़ेंगे इसी वीडियो के अंदर बाद में तब हम डिसकस कर रहे होंगे क्योंकि वो तब यूज होता है। कंपाइल टाइम पॉलिमोर्फिजम की अगर बात करें यानि फंक्शन ओवर लोडिंग की बात करें तो आसान भाषा में इसका मतलब है कि हम डिफरेंट फंक्शन क्रियेट कर देते हैं और उन सारे फंक्शन के सेम नाम होते हैं। अब हमने पहले बनाई थी एक student class, इसके अंदर दो properties हमने define की थी, अब मान लेते हमें एक function create करना है public void print info, अब इस print info function के अंदर हम अपना कोई parameter pass करेंगे, मान लीजे information में हमें सिर्फ name दिखाना है, तो name हमने pass कर दिया, और उसको हमने लिख दिया print name, अब एक और function अगर हम ब और उसके अंदर हम पास कर दे age, और इस function के अंदर हमें क्या करना है, age को print करवाना है student की, और एक तीसरा function हम लिखें, public void, print info, string name, int age, और यहाँ पर हम दोनों चीजें print करवाने वाले हैं, यानि name, plus हमारी age, अब हमने ये तीन functions बना दिये same class के अंदर और तीनों functions का नाम same है, इस चीज को, इस implementation को java के अंदर, या even C++ के अंदर polymorphism कहते हैं, यानि हमने same function को बार-बार अलग-अलग purpose के लिए use कर लिया, अब इससे फाइदा क्या हुआ, कि हम some object.printinfo call करेंगे, उसके अंदर जो भी information जैसे अगर हमारे पास already एक student है S1 और S1 के लिए हमें print करवानी है सिर्फ उसकी age, तो हम call करेंगे print info और उसमें pass कर देंगे S1 की age, और इसको save करके अगर run करें, तो हमारे पास output में क्या आएगा, हमारे पास output में आएगा 24, उसी तरीके से मान लेते हैं age के साथ हमें उसका ना कॉल लगा है तो हमारे पास आ गया हमारा नाम और हमारी एज तो कुछ इस तरीके से डिफरेंट फंक्शंस जब उनके सेम नाम होते हैं तो जावा के अंदर इस कॉंसेप् ओवर लोडिंग ओवर लोड करना यानी सेम नाम के फंक्शन को एक ही क्लास के अंदर क्रिएट करना अब ऐसा नहीं है कि हम यहां पर लिखें पब्लिक वॉइड प्रिंट इनफो स्ट्रिंग ने और पब्लिक वॉइड प्रिंट इनफो स्ट्रिंग उसकी क्लास यानि अगर हमें string name और दूसरे में भी string name करना है तो एक का return type void होगा तो दूसरे का return type void नहीं हो सकता। दूसरी चीज या अगर इनके return type same है तो फिर इनके अंदर parameters के type अलगलग होने चाहिए। एक में अगर string type का argument है तो दूसरे के अंदर integer, float, boolean कुछ और होना चाहिए। अगर ये भी same है तो इनके अंदर number of arguments अलगलग होने चाहिए। यानि एक function के अंदर अगर हमने public void print info string name दे दिया। तो दूसरे function के अंदर भी अगर हम public void print info string name दे रहे हैं तो हमें एक और argument add करना पड़ेगा, नहीं तो error आ जाएगा, अगर यहां से हम int age हटा दे तो फिर error आएगा हमारे code के अंदर, इसलिए इसको compile time polymorphism कहते है, compile time polymorphism यानि, जब compilation चल रही होती है हमारे code की तब ही detect कर ले रन टाइम पॉलिमॉर्फिजम के अंदर कंपाइल टाइम में कंपाइलर ढूंढ नहीं पाता अगर कोई एरर्स होते हैं यहाँ पर गलती करेंगे तो एरर आएंगे रन टाइम पॉलिमॉर्फिजम में क्या होगा जब कोड रन करेगा तो रन करते टाइम एरर आएंगे जो की जाधा खतरनाक है क्योंकि अगर जावा से मान लीजिए हमें कोई बड़ी सी आप बनाई हैं और वहाँ पर जाकर run time में exceptions आ रहे हैं, run time में problems आ रहे हैं, तो वो एक बड़ी problem होती है, क्योंकि काफी सारे users impacted होते हैं, इसलिए हमें कोशिश करनी चाहिए कि polymorphism implement करें, तो compile time की तरफ जादा जाएं, और run time की तरफ थोड़ा सा कम जाएं, लेकिन सीखने दोनों हैं, क्यों इनहेरिट करना इंग्लिश में अगर बात करें तो होता है कि एक जनरेशन से दूसरी जनरेशन तक पास करना और जावा की फॉर्म में क्लासेस के अंदर ओब्जेक्स के अंदर इनहेरिट करना होता है एक क्लास की प्रॉपर्टीज जब कोई दूसरी क्लास लेना चाती है मतल अब यह शेप क्लास है और इसके अंदर एक और प्रॉपर्टी है जिसका नाम है कलर यानि कोई शेप बनाएंगे हम और उसका हम कोई कलर दे देंगे अब हम डिफरेंट शेप की अगर बात करें तो रिक्टांगल अलग होता है ट्राइंगल अलग होता है सरकल अलग होता है यह अलग-अलग शेप्स हैं जिनकी अलग-अलग साइजेस होते हैं अलग-अलग इनका एरिया कैलकुलेशन होता है पेरिमेटर कैलकुले� तो अलग से हम एक class बनाएंगे, triangle, तो उसमें हम क्या लिख सकते हैं, extends shape, तो इस तरीके से क्या हुआ, triangle class ने extend कर लिया, inherit कर लिया, ले लिया properties को, shape class की, अब triangle class के objects के अंदर automatically एक color नाम की property होगी, भले ही उसके अंदर हम वो property define ना करें, example देखते हैं, इसके लिए object create करते हैं, object create करेंगे triangle type की triangle T1 is equal to new triangle, अब T1 के लिए हम color अगर लिखें, तो मान लीजे T1 को color हम दे रहे हैं red, तो यहाँ पर क्या हुआ, कोई error नहीं आया, यानि T1 के पास already एक color नाम की property existing थी, जिसमें हमने red assign कर दिया, जबकि triangle नाम की class के अंदर हमने कोई color define ही नहीं किया, तो इसको कहते हैं एक class की properties को, properties ही नहीं, methods भी, जब दूसरी class inherit कर लेती है, ले लेती है, उस process को कहते है inheritance, अब inheritance के बहुत सारे uses हो सकते हैं, जैसे हम किसी website का एक example लें, उसके उपर बहुत सारे buttons हो सकते हैं, अब एक button की shape हमेशा एक extended round edges वाले rectangle की हमें रखनी है, तो हम क्या क उसके बाद सारी जो बटन अलग-अलग बटन वाली क्लासेज हैं वह उसको इनहेरिट कर लेंगी तो रियूज़ एबिलिटी बढ़ती है इनहेरिटेंस रियूज़ एबिलिटी का मतलब हमें बार-बार सेम कोड नहीं लिखना पड़ता एक ही कोड को हम बार-बार उसकी सब क्लासेज में इंप्लीमेंट कर लेते हैं अब जिस क्लास से प्रॉपर्टीज ली जाती है उस क्लास को कहते हैं बेस क्लास और जो क्लास प्रॉ तो इस तरीके से इनहेरिटेंस काम करती है इनहेरिटेंस के जावा के अंदर चार टाइप्स होते हैं C++ के अंदर पाँच टाइप्स होते हैं C++ के अंदर multiple inheritance नाम का एक concept होता है जो जावा के अंदर classes में नहीं होता लेकिन जावा smart language है तो इसके अंदर interfaces आ जाते हैं अगर इनहेरिटेंस की बात करें तो इनहेरिटेंस के चार टाइप्स होते हैं जिसमें से सबसे पहला होता है single level inheritance सिंगल लेवल इनहेरिटेंस यानि उपर एक बेस क्लास होगी, नीचे एक डिराइव्ड क्लास होगी, और एक सिंगल लेवल इनहेरिटेंस हमारा बना रहेगा, तो इसका एक्जाम्पल हम कोड करके देखते हैं, सबसे पहले एक क्लास बनाते हैं, जिसका नाम है shape, अब shape क्ला यह फंक्शन क्या करेगा इस फंक्शन का काम है एरिया को डिस्प्ले कराना अब एक दूसरी क्लास बनाते हैं तो इस क्लास को हम नाम देंगे ट्राइंगल ट्राइंगल एक टाइप अफ शेप है तो कह सकते हैं कि शेप के अंदर जितनी भी प्रापर्टीज होगी तो यहाँ पर एक क्लास बनाते हैं ट्राइंगल अब इस triangle class को shape class को inherit करना है, वो भी single level inheritance है, और inheritance के लिए java के अंदर हम एक keyword यूज़ करते हैं, जिसको हम कहते है extends, तो हम लिखेंगे class triangle extends, किस class को extend कर रही है, मतलब हमारी base class क्या है, हमारी base class है shape, तो syntax कुछ इस तरीके का है, कि सबसे पहले हम लिखते हैं derived class, उसके बाद लि� इस तरीके से shape की जितनी भी properties होंगी वो सारी की सारी हमारी triangle class के अंदर आ जाएंगी अब सारी properties नहीं आएंगी पर वो चीज हम सीखेंगे axis modifiers जब पढ़ रहे होंगे पर अभी के लिए मान ले दें सारी properties आ गई है तो triangle class के अंदर हम दुबारा से area function मनाते हैं सबसे पहले parameters ले लेते हैं एक triangle के लिए उसका area जो होगा उसके लिए हमें चाही होगी length और उसकी height है और हम लिख देंगे हाफ इंटू लेंथ इंटू हाइट यह हो गया हमारे ट्रायंगल का एरिया तो इस तरीके की जो इनहेरिटेंस है उसे हम करेंगे सिंगल लेवल इनहेरिटेंस यानि एक लेवल नीचे तक इनहेरिटेंस काम कर रही है अब इसके अलावा एक और टाइप को इनहेरिटेंस होता है सेकंड टाइप जो है मल्टी लेवल इनहेरिटेंस मल्टी लेवल यानि एक से ज्यादा लेवल हमने क्रिएट कर लिए अब यहां पर हमने शेप बनाई एक क्लास और उसको triangle ने extend कर लिया अब एक और class बना लेने है जिसका नाम है equilateral triangle अब equilateral triangle जो है इसकी जो base class बनेगी वो होगी triangle अब equilateral triangle हमारा एक ऐसा triangle होता है जिसकी सारी की सारी sides equal होती है अब triangle की जो भी properties होती है वो by default equilateral triangle में तो आई जाएंगी इसलिए equilateral triangle triangle का derived class बनेगा और इस एक्विलेटरल ट्राइंगल में हम फिर से कोई और फंक्शन बना सकते हैं, मान लीजिए दुबारा से वही फंक्शन बना दिया हमने area, और इसके अंदर पारेमीटर फिर से वही हम सेम पारेमीटर ले लेंगे, length हर हमारी height, and अंदर हम print कर रहे होंगे हमारा area, तो इस तरीके से यहाँ पर multiple levels create हो गए, basically दो levels create हो गए, सबसे पहली base class थी हमारी shape, shape के नीचे आई triangle, triangle के नीचे आई equilateral triangle, इस तरीके से हमारी chaining हो गई inheritance कि इसको कहते है multiple, टी लेवल इनहेरिटेंस तीसरी टाइप इनहेरिटेंस होता है हमारे पास हायरार्कियल इनहेरिटेंस हायरार्कियल इनहेरिटेंस यानि एक ही बेस क्लास है और मल्टिपल डेराइव्ड क्लासेस नहीं मल्टिपल सब क्लासेस मल्टिपल चाइल्ड क्लासेस में उसी सेम बेस क्लास को इनहेरिट कर रखा है जैसे यहां पर अगर एग्जांपल लें तो शेप को इनहेरिट किया ट्रायंगल क्लास ने अब एक और क्लास अगर हम बनाएं जिसको नाम दे सर्कल अ सर्कल भी shape class को inherit कर ले और उसके अंदर भी हम एक function मना दे area जो circle का area print करवाएं अब circle का area काफी आसान है हमें पता है pi r square तो इस तरीके से triangle class की base class भी shape class circle class की base class भी shape class इसलिए इस चीज को इस टाइप अफ इनहेरिटेंस को हम कहते हैं हायरार्कियल इनहेरिटेंस एक हायरार्कियल बन गई है सबसे पहले आई हमारी बेस क्लास उसके बाद आई हमारी डिफरेंट डिराइव क्लासेस चौथा टाइप अफ इनहेरिटेंस जावा के अंदर होता है हाइब्रि� इसके अलावा एक fifth type of inheritance भी होता है, जिसको हम कहते है multiple inheritance, अब multiple inheritance classes की form में java के अंदर नहीं होता, c++ में होता है, java के अंदर हम interfaces को use करते हैं उसे implement करने के लिए, और वो हम देख रहे होंगे आगे जाकर कि कैसा होता है, किस तरीके से implement होता है, यहाँ पर हमने अपने inheritance को complete कर ल कि हमारे packages क्या होते हैं Java के अंदर दूसरा हमारे access modifiers क्या होते हैं अब सबसे पहले बात करते हैं packages की एक पैकेज की अगर बात करें तो हमें पता है पैकेज का English में मतलब क्या होता है पैकेज होता है कि एक कार्टिन आपने ले लिया उसके अंदर related जो सामान है उसको आपने डाल दिया एक जैसे सामान को जैसे एक पैकेज आपने पेंस का बना दिया एक पैकेज आपने इरेजर्स का बना दिया एक पैकेज आपने पेंसल्स का बना दिया उसी तरीके से कोड में भी चीजें लॉजिकली लिखनी होती है लॉजिकली यानि सामान इस तरीके से फैला नहीं होना चा और हमेशा कोई नया बन्दा टीम के अंदर आता है तो वो उसी code को पढ़के सीख रहा होता है तो उसके लिए difficult हो जाता है चीजे करना है ताकि मतलब समझ में आए अब उसी अच्छे तरीके से गुड फॉर्माट में कोड को लिखने का एक तरीका है पैकेजेस बनाना जावा के अंदर पैकेजेस के अंदर हम रिलेटेड कोड लिखते हैं जैसे अगर इसका एग्जांपल लें तो अगर हम उसके अंदर कोई एक चीज हो सकती है जो सिर्फ बटन्स को हैंडल कर रही है कोई एक चीज हो सकती है जो उसके सिर्फ कलर को हैंडल कर रही है या उसका लुक कैसा होने वाले है उसको हैंडल कर रही है एक चीज हो सकती है जो यूजर के डेटा को हैंडल कर रही है अब ये ती साथ के साथ उसमें user का जो data है उसको change करने की modify, delete, add करने की जो सारी की सारी चीजें होगी, functionality होगी, उसके लिए अलग package बना दें। तो इस तरीके से packages के अलग-अलग काम होते हैं। अब java के अंदर बात करें तो java के अंदर दो type of packages होते हैं, पहले ही वो जो java के अंदर पहले से exist करते हैं जिनने हम कहते हैं built-in packages, दूसरे वो होते हैं जो user खुद बनाते हैं, यानि हम खुद अपने packages बना सकते हैं। अब यहाँ पर सबसे पहले बात करें बिल्ट इन पैकेजेस की तो हमने रियलाइज नहीं किया होगा पर हम आज तक काफी सारे जावा के पैकेजेस यूज करते आ जुके हैं। तो एक्चुली ये java.util जो है ये एक package है java के अंदर जिसके अंदर already काफी सारे related classes हैं मतलब utility classes है utility functions है जिनको हम directly use कर सकते हैं इसके अलावा और भी काफी सारे होते हैं जैसे अगर हम linked list आगे पढ़ेंगे data structures की जब बात करेंगे हम stacks पढ़ेंगे queues पढ़ेंगे काफी सारी hash है तो वहां पर वह सारी चीजें भी पैकेज होती है यह भी पैकेज इस बेसिकली कि रिलेटेड आइटम्स रिलेटेड जो चीजें उनको आप एक साथ डाल दे ताकि ऑडर बना रहे हैं ताकि लॉजिक बना रहे हैं कोड लिखने का अब सबसे के हम एक पैकेज क्रिएट करेंगे उसके लिए नई चास एक नई फाइल बनाते हैं इस फाइल को नाम देते हैं बैंक तो इसको नाम देंगे पब्लिक क्लास बैंक अब इसके अंदर क्या करेंगे इसको सबसे पहले स्टोर कर लेंगे बैंक जावा के नाम से और अब एक नया फोल्डर बना लेते हैं, नई फोल्डर को भी नाम देते हैं, बैंक, और इस फाइल को वहाँ पर स्टोर कर लेते हैं, सबसे पहले इसमें पैकेज का नाम भी हम बैंक दे देते हैं, तो सेव कर लिया, इसे हमने उठा कर रख दिया अपने बैंक नाम के फोल् जिसमें हो सकता है हमारे employees की information हो हमारे जितने accounts create हुए हैं उसकी information हो तो सबसे पहले class बना लेते हैं जिसको नाम देंगे हम account अब इस account class के अंदर हम क्या करेंगे कुछ-कुछ basic information store कर लेंगे जिसमें से सबसे पहले ही हो सकती है हमारा string name इसे कर देते है public और अपनी oops class के अंदर import करेंगे इस package को तो किसी package को use करने के लिए उसको सबसे पहले import करना पड़ता है import लिखकर फिर लिखेंगे हम bank तो इस तरीके से हमने bank नाम का जो package है उसकी सारी जो public चीज़ें हैं उसको import कर लिया है और यहाँ पर उन्हें use कर लेंगे तो यहाँ लिखेंगे bank.account के नाम का हम account1 बनाएंगे new bank.account और यहाँ पर account1 को हम नाम दे देंगे किसके लिए account खुला है हमारे customer1 के लिए तो कुछ दूसरे पैकेज की जो इनफॉर्मेशन है उसको अपने पैकेज में यूज कर सकते हैं अपने पैकेज की इनफॉर्मेशन दूसरे पैकेज में यूज कर सकते हैं अब आगे बढ़ने से पहले हम कुछ एक्सेस मॉडिफाइयर्स नाम की चीज के बारे में बात हैं एक्सेस मॉडिफाइयर्स का मतलब होता है यह डिफाइन करना कि कौन सी चीज किसको एक्सेसिबल होगी यानि हमारे कुछ information sensitive होती है, जैसे हमारे passwords हो गए, जो हम सारी files को नहीं देना चाहते हैं, मान लीजे एक बड़ा सा system है company का, जिसमे accounts department भी काम कर रहा है, उनके लिए भी कुछ-कुछ functionality, कुछ-कुछ software है, tech team भी काम कर रही है, उनके लिए भी कुछ-कुछ software है, साथ के साथ हमारे management वाले हैं, उनके लिए भी कुछ-कुछ software है, अब हम नहीं चाहेंगे कि जो accounts team, जो पैसे की business transactions होते हैं, या tax की transactions होते हैं, company की internal, वो हमारी टेक टीम को दिखने लग जाए या वो हमारी मैनेजमेंट टीम को दिखने लग जाए। इसी तरीके से सेंसिटिव इंफोर्मेशन को हमें देखना पड़ता है कि कौन सी फाइल में जाए। और इसी डिफरेंट टाइप्स अफ इंफोर्मेशन को हम जावा के अंदर public जिसके सामने हमने लिख दिया चाहे वो method हो, चाहे वो हमारे characteristics हो, जैसे हमारे parameters हो गए, जैसे string name के सामने अगर हमने public लिख दिया, तो ये information हमारी पूरी की पूरी class में कोई भी access कर सकता है, साथ के साथ किसी दूसरे package में भी कोई भी access कर सकता है, यानि कहीं से भी अगर किसी ने object बना लिया, तो कोई भी इस information को access कर सकता है, जैसे इसका example है हमारे पास public string name, अब public class bank के अंदर अगर हम अपना main function बनाए public static void main इस function के अंदर अगर ध्यान से देखे तो जो हमारा main function होता है वो भी public होता है इसे public होने की क्यों जरूरत है क्योंकि जब compiler हमारा काम करता है java runtime environment में तो उसको सबसे पहले डून कर निकालना पड़ता है कि कौन सी class से execution शुरू अब public बना लिया इसके अंदर हम एक account बनाते हैं account1 account1 में हमने किया new account तो एक नई object बना ली अब account1 का हम कुछ नाम रख देते हैं तो name हमने रखा अपना college तो इस तरीके से क्या हुआ ये जो हमारे public नाम था इसको हम access कर पाए यहाँ पर अपनी main function के अंदर अब next type का जो access modifier होता है वो होता है default अब default हमें खुद से specify नहीं करता अब default हमें खुद से specify नहीं करना पड़ता default already exist करता है किया नहीं किसी भी parameter के सामने किसी भी property के सामने किसी भी function के सामने अगर आप कुछ भी नहीं लगाते तो वो default type का हो जाता है default type का यानि अपने package के अंदर सारी की सारी चीजें उसे access कर पाएंगी बस कोई दूसरा package उसको access नहीं कर पाएगा यानि अगर जिस भी file में हमने package का नाम bank रख दिया सिर्फ वही पैकेज़ेस हमारे डिफॉल्ट को एकसेस कर पाएंगे अब यहां से अगर हम पब्लिक हटा दें तो यह जो नेम हो जाएगा यह हो जाएगा हमारे डिफॉल्ट टाइप का प्रोटेक्टेड यानि उसे अपने पैकेज में तो सारी चीज़ें एकसेस कर सकती हैं यहाँ पर अगर हम प्रोटेक्टेड लिख दें और फिर लिखें कोई string email, तो ये email जो information है, इसे सिर्फ दूसरे package में सब classes ही access कर पारी होंगी, और current package में कोई भी access कर सकता है, तो यहाँ पर हम जो account 1 हमने लिया, उसके लिए email हम लिख देते हैं, अपना college at the rate gmail.com, चौथे type का access modifier हमारे पास होता है private, private को class के बाहर कोई भी access नहीं कर सकता है, सिर्फ एक class के अंदर ही उसको access किया जा सकता है, यानि account के अंदर कुछ भी चीज़ अगर private होगी, तो सिर्फ account class access कर पाएगी, ना उसकी sub classes access करेंगी, ना उसके package में कोई और class access करेंगी, ना किसी बाहर के package को access करने दिया जाएगा, यानि यह जो bank class है, यह भी account class की private चीज़ों को access नहीं कर सकती, private string password, तो यहाँ पर अगर हम कोशिश करें कि account1 का हम password set कर दें, ABCD, तो वो possible नहीं होगा, यहाँ पर error आ गया था, field account password is not visible, यानि इस bank class को account class के जो private चीज़ें हैं, जैसे उसका password वो visible ही नहीं है, उसको आप reset करी नहीं सकते हैं, अब सवाल आता है, तो फिर private चीज़ों को हम access कैसे कर तो जब भी कोई चीज प्राइवेट होती है तो जावा के अंदर हम दो टाइप के फंक्शन बना देते हैं, पहले टाइप फंक्शन को हम कह देते हैं getters, getters यानि उस प्राइवेट चीज की आप information वापस दे दीजे, और दूसरे टाइप फंक्शन होते हैं setters, यानि उस प्र पासवर्ड को अगर get करना है तो उसके लिए function मना लेते है public string get password अब get पासवर्ड के अंदर हम क्या करेंगे return कर देंगे इस डॉट पासवर्ड को और इस डॉट पासवर्ड को return कर दिया तो यह हो गया हमारा getter अब इसके साथ एक setter भी मना सकते हैं हम चाहें तो कुछ cases में पासवर्ड खुद से define कर सकते हैं और उसके लिए setter नहीं बनाएं तो यहाँ पर कर देते हैं set password और यहाँ पर कोई string ले लेते हैं pass नाम से और this dot password को हम set कर देते हैं string pass से यहाँ पर इसे कर देते है public void क्योंकि कुछ return नहीं करेगा तो यह हमने बना दिया getter यह हमने बना दिया setter अब यहाँ पर हम क्या करेंगे सबसे पहले password को set करेंगे तो set password में pass करेंगे अपना password abcd और उसके बाद और उसके बाद हम print करवा देंगे तो account1.get password तो get password करके password को print करवा देंगे इसको अगर save करें है और इसे रन करें तो हमारे लिए प्रिंट होना चाहिए हमारे अकाउंट वन का पासवर्ड आप हमारे लिए आउटपुट में आया है ABCD तो कुछ इस तरीके से हम प्राइविट प्रॉपर्टीज को प्राइविट फंक्शंस को एक्सेस करते हैं अगर हम चाहते कि हम क्या करें हम सेट करने का ही ऑप्शन ना दें यूजर को ऑटोमाटिकली उसके लिए पासवर्ड जो है वह अगर function को भी private बना दिया तो फिर इस function को हम यहां से bank class से call नहीं कर पाएंगे, आप सोचेंगे कि इसका क्या use है, अब इसका यह use है कि internally बहुत सारे ऐसे functions होते हैं, मानलीजिए get password जो है, सबसे पहले set password को automatically call करे, उस में कोई random password वो खुद से डाल दे और उसी को return कर दे, कि यह आपका password है, तो इस तरीके से set password को यह वाली class access नहीं कर पाएगी, लेकिन हमारा get password जो function, internal function, वो access कर पाएगा, तो इस तरीके से काफी सारे oops के concepts बना कर, बहुत सारी logical चीज़े implement हो सकती हैं, real world problems को solve करने के लिए, अब हमने पढ़ लिये packages और access modifiers, अब बात करते हैं कि हमारे encapsulation नाम के concept का क्या मतलब हुआ, तो indirectly हमने encapsulation को पढ़ लिया है, encapsulation का मतलब देसी भाषा में यह होता है, कि आप data और उसके functions को combine कर दें एक ही entity में, क्लास बनाते हैं तो आप क्या करते हैं डेटा और उसके फंक्शन्स डेटा यानि हमारी क्लास की प्रॉपर्टीज फंक्शन्स यानि उसमें लिखे हुए मेथड्स उन दोनों को कमबाइन करके हमने एक यूनिट के अंदर डाल दिया और इस यूनिट को जावा के अंदर हमने तो क्लासेस बनाने का मतलब, ओब्जेक्स बनाने का मतलब is encapsulation अब encapsulation की मदद से data hiding का concept possible हो पाता है जावा में data hiding यानि आपको कुछ data जो user को दिखाना नहीं है, जो sensitive data है उसे आप छुपा लेते हैं तो data hiding का concept हम कैसे implement करते हैं? access modifiers की help से जिस चीज़ को private बनाना है, किस चीज़ को protected बनाना है, किस चीज़ को public बनाना है उससे हम देख सकते हैं कि कौन सा data hide होगा, किस के लिए hide होगा, किस तरीके से hide होगा इसके अलावा एक चौथा main pillar of oops होता है जावा के अंदर जिसको हम नाम देते है abstraction abstraction का मतलब होता है कि important चीज़ें user को दिखा देना और non important चीज़ें user से छुपा लेना अब abstraction और data hiding में काफी सारे बच्चे confused हो जाते हैं abstraction का मतलब है user को important चीज़ें दिखा देना और फालतु चीज़ें उससे छुपा लेना अब abstraction को java के अंदर दो तरीके से हम implement करते हैं पहला हो सकता है कि हम abstract keyword को use करें abstract classes बनाए, functions बनाए, properties बनाए दूसरा होता है हम interfaces को use करें सबसे पहले discuss करेंगे कि abstract class नाम की चीज़ क्या होती है और यह abstraction क्या चीज़ होती है तो अपनी original class oops के अंदर हम आ जाते हैं इसे कर देते हैं, save करके खतम तो यह है हमारी class और इसके अंदर हम discuss करेंगे abstraction अमान लीज़े हमें क्या करना है, हमें एक animal बनाना है तो अनिमल के लिए सबसे पहले हम मोटा-मोटा एक ब्लूप्रिंट बना लेंगे, उसके बाद हम डिफरेंट टाइप्स अफ अनिमल्स को बनाएंगे, अब ये ब्लूप्रिंट और डिफरेंट टाइप्स अफ अनिमल्स, अभी हमने इनहेरिटन्स पढ़ा, तो हम समझ पा र कि इस क्लास के अंदर कुछ फंक्शंस होंगे पहला फंक्शन हम रख लेते हैं पब्लिक वॉइड वॉक तो आनिमल वॉक कर सकता है इस तरीके का हमने फंक्शन मना लिया है अब इस आनिमल क्लास को एक नई क्लास इनहेरेट करेगी उस क्लास को नाम देते हॉर्स तो क्लास हॉर्स क्या कर यह एनिमल को जिसके अंदर हम फिर से वॉक फंक्शन लिखते हैं पब्लिक वॉइड वॉक और इस वॉक फंक्शन के अंदर हम कुछ डिस्प्ले कराएंगे वॉक्स ऑन फोर लेग्स अब एक और क्लास बना लेते हैं जिसको हम क्या नाम दे देते हैं जिसको नाम दे देते हैं हम है और इसमें भी हम कुछ डिस्प्ले करा देते हैं वॉक्स ऑन टू लेग्स जितना मुझे याद आ रहे हैं तो अब हमने दो क्लासेस बना दिया हॉर्स क्लास चिकन क्लास दोनों क्लासेस एनिमल को एक्सटेंड करती है और सबके अंदर हमने वॉक्स फंक्शन बना दिया अब सवाल यह उठाए कि जब भी हम हॉर्स बना रहे होंगे या क्योंकि animal classes की जितनी भी properties हैं, वो तो directly horse class, chicken class के अंदर आ ही रही है, तो क्या हम वहाँ पर जा कर देख सें, क्या user के पास ये right हो, कि वो animal को जा के भी walk करा सके, तो यहाँ पर एक तरीके से animal class जो है, वो irrelevant है, उसकी चीजें हमें user को दिखाने की जरूरत नहीं है, और animal का anyways हम कोई object तो बनाएंगे नहीं, क्यों, क्योंकि animal कोई specific animal तो है ही नहीं, हम horse से नया horse create कर सकते हैं, चिकन से नया चिकन create कर सकते हैं, animal का कोई type ही नहीं है, तो animal हमें बनाने की ज़रूरत नहीं है, तो इस class को हम कर देंगे abstract, abstract class, abstract class कैसे किया, इसमें हमने लिख दिया keyword abstract, abstract का English की भाषा में मतलब होता है कि कोई concept है, कोई abstraction यानि एक खयाल है, एक blueprint है, उसको सच नहीं करना है, वो सच नहीं है, वो बस exist करता है, उसके बारे में हम सोच सकते हैं, उसके बारे में हम उसको create कर सकते हैं, पर उसको actually use नहीं कर सकते हैं, तो animal class भी कुछ वैसी है, जिसको एक concept की तरह हमने बना दिया है, कि animal होता होगा कुछ, जिसमें दीन चार चीज़ें होती होगी, लेकिन actual animal जो बनेंगे, वो तो horse और chicken बने जैसे इस walk function का कोई काम नहीं है, यह function बस exist करता है, अब हम चाहते हैं कि जो भी animal class बने, उसमें walk function तो हो ही हो, क्योंकि सारे animals walk कर पाएं, इसलिए इस walk function को रखना है पर इसका कोई काम नहीं है, इसे यहाँ पर use नहीं करना, तो हम इस function को भी abstract बना सकते हैं, और यहाँ पर लि और इस function को अगर हमने abstract बना लिया है तो अब इसका implementation लिखने की ज़रूरत नहीं है, यानि यहाँ पर सीधा semicolon लगा कर हम इसको खतम कर सकते हैं कि walk नाम का एक function होगा, जो हर type के animal में exist करना चाहिए, तो यह हमारी हो गई abstract class, अब यहाँ पर जब हमने animal बनाया, अब main class में क्या करेंगे, एक horse type का horse बना लेते हैं, और उसके लिए हम call कर लेते हैं, डॉट वॉक इसको सेव करते हैं और एक बार रन करते हैं तो हमारे आउटपुट में हमारे पास आएगा वॉक्स ऑन फोर लेक्स्ट इस एनिमल करके तो यहां पर क्या हुआ एनिमल के लिए चलिए एक बार वॉक कॉल करके देखते हैं इसको सेव करते हैं रन करते हैं तो जैसे ही हम animal के लिए code run करेंगे, यहाँ पर एक error आएगा, cannot instantiate the type animal, यहाँ पर instantiate यानि initiate करना, create करना, यहाँ पर हम animal type के object को बना ही नहीं सकते, क्यों नहीं बना सकते, क्योंकि animal एक abstract concept है, बस concept है, blueprint है, उसको actually नहीं create किया जा सकता, और यहाँ पर जिस type का हमने error face किया, इसको कहते है runtime error, compilation में यहाँ पर कोई red line नहीं आई, जब उसको run किया, तब ही error आया तो वो है runtime error इसलिए अगर हम OOPS के कुछ concepts को अगर गलत use कर देते हैं तो compilation में कभी-कभी detect नहीं कर पाते जब actually उनको use करना होता है runtime पे तब उन्हें detect करते हैं इसलिए OOPS के concepts को काफी अच्छे से पढ़ना पढ़ते हैं हमारी abstract class की पहली property है abstract class must be declared with abstract keyword उसके अंदर abstract और non-abstract दोनों types के methods हो सकते हैं यहाँ पर हमने walk बनाया था इसके अलावा यहाँ पर हम चाहते तो normal method भी मना सकते थे बिना abstract के public void eats या eat जिसके अंदर हम print कर सकते हैं animal eats है तो यह हमने एक फंक्शन बना दिया अनिमलीट करके तो यहां पर जो भी हम अनिमल बनाएंगे जैसे हमने हॉर्स बनाया तो हॉर्स के लिए हम इट कॉल कर सकते हैं क्योंकि हॉर्स के अंदर तो इट फंक्शन नहीं है लेकिन उसने इनहेरिट किया अनिमल की सारी प्रॉपर्टीज को तो इस तो वह कर सकता है इसलिए यहां पर सबसे पहले प्रिंट होगा टाइटिक मेथोड ऑल्स यह नियुक्त में स्टाइटिक मेथोड भी हो सकते हैं स्टाइटिक मेथोड पड़ेंगे अभी क्या होते हैं अगर हम बार करें कंस्ट्रक्टर की तो क्या कर सकते हैं यहां पर हमें कंस्ट्रक्टर बना सकते हैं तो एनिमल का अगर हमने कंस्ट्रक्टर बनाया तो उसके अंदर लिख सकते हैं यू आर क्रिएटिंग और न्यू एनिमल इसे सेव कर लेते हैं एंड यहां यह दोनों हटाकर अगर हम होस के अंदर भी कंस्ट्रक्टर बनाएं होर्स नाम का अ यहाँ पर लिखेंगे, created a horse, इस code में हमने क्या किया, एक animal नाम का constructor बना दिया animal class में, एक horse नाम का constructor बना दिया horse class में, और अब इस code को run करें, तो main function के अंदर ध्यान से देखें, क्या कर रहे हैं, एक horse नाम की बस object बना रहे हैं, तो जैसे ही horse को हमने create किया, सबसे पहले लिखा यानि जब भी आप derived class का कोई object create करते हैं, तो सबसे पहले base class का constructor call होता है, फिर derived class का constructor call होता है, इस concept को java के अंदर constructor chaining कहते हैं, यानि chain of constructors run करती है, जब भी आप inheritance में object बनाने की कोशिश करते हैं, उसके बाद बात करने तो, it can have final methods which will force the subclass not to change the body of the method, यानि कुछ-कुछ ऐसे भी functions होते हैं, जो final हो सकते हैं, जिसमें अगर आप चाहें, तो आप वही सारे के सारे functions वैसे के वैसे implement करना चाहते हैं, जैसे अगर हमने herbivores बना दिया, तो इसमें eats के अंदर हम लिखना चाहेंगे, कि herbivores जो animals हैं, उसमें आप change नहीं कर सकते हैं, अब next बात करते हैं, इस second type of abstraction की जो use करता है, interfaces को, interfaces के अंदर pure abstraction होती है, यहाँ पर क्या हुआ animal नाम का हमने function में आ दिया जिसको horse भी use कर सकता है, chicken भी use कर सकता है और यह function जो है abstract नहीं है, फिर भी java ने allow कर गया तो यह pure abstraction नहीं है, pure abstraction क्या करेगी, सारी useless information hide कर लेगी और सारी जो है useful information user के लिए उसे दिखा देगी तो ऐसा pure abstraction java के अंदर आता है interfaces की help से interfaces class जैसे ही होते हैं, बस कुछ उन में fixed properties होती हैं इंटरफेस को डिफाइन करते हैं, इंटरफेस कीवर्ड से, तो हम लिखेंगे इंटरफेस, और उसके बाद लिख देंगे, जो भी इंटरफेस का नाम रखना चाहते हैं, तो हम animal नाम रखना चाहते हैं, अब इस इंटरफेस animal में, हम क्या करना चाहते हैं, एक walks function बनाना चाहते हैं, तो लिख देंगे void, walk, तो ये हमारा पूरा का पूरा animal जो है, वो डिफाइन हो गया, अब यहाँ पर हम चाहें कि animal का हम constructor बना दें, तो वो possible नहीं है उसमें हमारा error आ गया क्योंकि interfaces के constructors नहीं हो सकते अब अगर चाहें कि यहाँ पर हम बना दे void eat नाम का एक function तो उसके अंदर error आ गया क्योंकि animal के अंदर interfaces के अंदर कोई भी non abstract function नहीं होना चाहिए ना ही function की implementation होनी चाहिए तो उसको हम नहीं implement कर सकते animal की जो property होगी उसको specific animal ही implement करेगा यानि अगर हम बनाएंगे class horse और interfaces को अब यहाँ पर extend नहीं करते, interfaces को java के अंदर implement करते हैं, तो लिखेंगे keyword implements animal, और interface को implement कर लिया, यानि उसको use कर लिया, तो उसकी सारी properties आ गई, तो अब हमें क्या करना है, animal का जो यह walk function था, इसे हमें दुबारा implement करना पड़ेगा, यहाँ पर सिर्फ उसको define किया है, यहाँ पर लिख देते हैं public, यहाँ भी लिख देते हैं हम public, तो यहाँ पर horse के लिए हम call कर पाएंगे walk, recap करते हैं animal नाम का interface बनाया, उसके अंदर हमने एक abstract function बनाया, फिर horse ने implement किया animal को और उसने इस function को implement किया, implement किया यानि use किया, अब interfaces की भी कुछ-कुछ properties पढ़ लेते है Public, Static और Final यानि अगर यहाँ पर Animal में मान लीजिए हमने लिखी एक Property Int आईज अब नंबर आप आईज अगर हमें डिफाइन करनी है तो वह यहां पर फिक्स नंबर आईज हम डिफाइन कर सकते हैं यानि आनिमल के लिए जो प्रॉपर्टीज होंगी यह सारे आनिमल्स के लिए सेम होंगी इसको चेंज नहीं कर सकते तो यह स्टाटिक अगर यहां से हम public हटा भी ने, तो भी यह method by default abstract भी है और public भी है, इसके सामने abstract keyword लिखने की जरूरत नहीं है, public keyword भी लिखने की जरूरत नहीं है, लेकिन horse में जब हम walk को implement करें, तब उसको इस सामने हम public keyword लिखना पड़ेगा, अगर यह public keyword हम हटा देंगे यहां से, तो error आ जा अब हमने inheritance की बात की थी तो उसमें multiple inheritance को discuss किया था multiple inheritance यानि दो base classes है और एक single derived class उन दोनों को use कर लिया अब वो classes में possible नहीं है java के अंदर लिकिन interfaces से कर सकते हैं कैसे अगर हम interface बनाए animal और एक और interface बना दे जिसको नाम दे herbivore तो इस interface के अंदर हम कर सकते हैं animal को भी implement कर सकते हैं horse में और herbivore को भी implement कर सकते हैं क्योंकि horse एक animal भी है और एक herbivore भी है कि सिर्फ plants खाता है तो इस तरीके से दोनों classes की property एक साथ ले लिये horse ने इसको हम कहते है multiple inheritance जो java के अंदर classes से नहीं होता interfaces से होता है यह काफी बार interview में सवाल पूछ लिया जाता है इसलिए emphasis डाला है इसलिए याद होना चाहिए हमें अब हमने काफी सारे concepts discuss कर लिये है एक last चीज चोटी सी चीज और discuss कर लेते हैं जिसका नाम है static java के अंदर static keyword हमने बार देखा होगा specially जब भी हम main function लिखते हैं, main function को लिखते है public static void main, अब उसमें main का हमें मतलब पता है, void का मतलब पता है, public का मतलब भी पता चल गया, उसमें static का क्या मतलब होता है, java के अंदर static एक special keyword होता है, static का मतलब वो चीज जो सबके लिए accessible है, public की तरहें नहीं, static हम उन properties को बताते हैं, मान लीजिए क्लास बनाते हैं student, तो student class के अंदर हम सबसे पहले उसका string कुछ name define कर लेंगे, फिर क्या करेंगे, उसके school का नाम define करेंगे, अब सोचे अगर तो हर एक student के लिए क्या school का नाम अलग-अलग होने वाला है, नहीं, वो साथ पूरी student class के लिए same school का नाम हम रखने चाहते हैं, तो उसके लिए क्या करेंगे, इसको कर देंगे static, तो जैसे ही हमने school को static बना दिये, यानि student class के जितने भी objects बनेंगे, उन सब के लिए school का नाम same होगा, इसको देखते हैं कैसे, main function के अंदर क्या करेंगे, सबसे पहले student.school करेंगे, अभी तक हम student class का पहले object बनाते थे, फिर dot करके चीजों को access करते थे, लेकिन जिन चीजों को हम static बनाते हैं, static method, static variables, उनको हम class के नाम से access कर सकते हैं, यानि student.school को हम यहाँ पर लिख सकते हैं, jmv, तो इस तरीके से directly हम static चीज़ों को access कर सकते हैं, क्योंकि वो class की चीज़ें हैं, वो object की चीज़ें नहीं हैं, object की चीज़ होगी, उसकी private चीज़ें, जो उसके लिए बनी हैं, जैसे उसका नाम, जो static हो गया, वो तो सारे के सारे objects के लिए common है, अब students.school में हमने कुछ नाम लिख दिया, अब एक student भी बना लेते हैं, student1 is equal to new student, और student1 के लिए नाम हम लिख देते हैं, तो student1.name किया, लेकिन school किया क्योंकि वो static है, तो उसके लिए student.school, लेकिन यहाँ पर हम print भी करवा सकते हैं student1 के लिए उसका school, लेकिन save करके अगर इसे run करें, तो हमारे लिए क्या print होकर आएगा student1 का school, जो है jmv, लेकिन अगर कल को मान लीजे school का नाम change हो गया, तो school का नाम जो भी change हो जाएगा, मान लीजे jmv के जगह अगर abc हो गया, तो उसके बाद सारे के सारे students के लिए एक साथ school का नाम change हो जाए तो स्टाटिक हम उन प्रॉपर्टीज को उन चीजों को बनाते हैं जिनको हम चाहते हैं कि वो कॉमन रहें अगर स्कूल का नाम अलग-अलग रखते हैं अलग-अलग स्टोर करते तो क्या करना पड़ता है हर एक स्टूडेंट के लिए जाकर अपडेट करना पड़ता है यहां पर एक ही बार में सबके लिए अपडेट कर देंगे ऐसे ही कुछ फंक्शन्स भी स्टाटिक हो सकते हैं ज तो यहाँ पर इसने automatically detect कर लिया है compiler ने कि यह जो school के हम बात करें यह हमारा static school है उसका नाम हम new school कर देंगे तो इस तरीके से सब के लिए एक साथ static variable change हो जाएगा अब static keyword को हम चार तरीके से use कर सकते हैं java के अंदर या तो उसको properties के सामने लगा सकते हैं जैसे हमने यहाँ लग उसके अंदर अब static keyword की एक और खास बात होती है memory में कि static के अंदर जितनी भी चीज़ें होते हैं जो भी चीज़ें static होती हैं उनको memory एक ही बार दी जाती है और जो object की चीज़ें होती है उनको memory बार दी जाती है इसलिए जब भी हमें memory बचानी है और हमारे पास क्या है common information है है तो उस वेरिबल उस फंक्शन को हम स्टाटिक बना देते हैं तो इस तरीके से अब हमने सारे कॉन्सेप्स ऑफ कवर कर लिए हैं जावा के अंदर यह सारे के सारे कॉन्सेप्स इंपोर्टेंट है क्योंकि यह यूज होते हैं जब भी आप अपने उप्स का काम है चीजों को सिस्टेमाटिकली ओर्गनाइज करना, कुछ-कुछ अच्छे कॉन्सेप्स को इंप्लिमेंट करना, ताकि कोडिंग हमारी बेटर हो सके, हम रियल वर्ल्ड में जैसे सिस्टेमाटिक चीजें चलती हैं, वैसे कि वैसे पूरे-पूरे सिस्टेम को उ जैसे अगर हम C++ की भी बात करें तो C++ और Java के काफी सारे OOPS के concepts overlap करते हैं तो अगर आपने Java का OOPS पढ़ लिया है या C++ का OOPS पढ़ लिया है मतलब आपने आदे से जादा same जो concepts हैं उनको पढ़ लिया है अब थोड़ी सी extra चीज़ें हमें बस करनी पड़ेगी language के हिसाब से तो I hope कि आज की class है हमें OOPS समझ में आये होंगे इसके अलावा अगर आपको कोई और वीडियो चेहे तो उसके बारे में आप नीचे comment कर सकते हैं till then keep learning and keep practicing