2013-02-06 94 views
6

मुझे जावा का उपयोग कर ऑब्जेक्ट उन्मुख प्रोग्रामिंग की सूचीबद्ध विशेषताओं वाली एक प्रोजेक्ट तैयार करने की आवश्यकता है।जावा उदाहरण encapsulation, polymorphism, और विरासत विशेषता?

क्या कोई यह पुष्टि करने के लिए मेरा त्वरित नमूना कार्यक्रम देख सकता है कि मैं समझता हूं कि इन विशेषताओं को कैसे लागू किया जाता है और वे सभी मौजूद हैं और सही तरीके से किए गए हैं?

package Example; 

public class Parent { 

    private int a; 
    public void setVal(int x){ 
     a = x; 
    } 
    public void getVal(){ 
     System.out.println("value is "+a); 
    } 
} 

public class Child extends Parent{ 

    //private fields indicate encapsulation 
    private int b; 
    //Child inherits int a and getVal/setVal methods from Parent 
    public void setVal2(int y){ 
     b = y; 
    } 
    public void getVal2(){ 
     System.out.println("value 2 is "+b); 
    } 
    //having a method with the same name doing different things 
    //for different parameter types indicates overloading, 
    //which is an example of polymorphism 
    public void setVal2(String s){ 
     System.out.println("setVal should take an integer."); 
    } 
} 
+3

आपके पास विरासत और encapsulation है, लेकिन आपके पास कोई polymorphism नहीं है। आपकी खुद की कोड टिप्पणी बताती है कि क्यों: विधि का एक ही नाम होना चाहिए। यह नहीं है जब आपका इरादा किसी विधि को ओवरराइड करना है तो हमेशा @ ओवरराइड एनोटेशन का उपयोग करें। –

+2

सुनिश्चित नहीं है कि ओवरलोडिंग बहुरूपता प्रस्तुत करने का एक तरीका है ([शायद नहीं] (http://stackoverflow.com/questions/824763/is-polymorphism-another-term-for-overloading))। अगर मैं आपको पहनता हूं तो मैं इसे [इस उदाहरण] (http://stackoverflow.com/questions/154577/polymorphism-vs-overriding-vs-overloading) में ओवरराइडिंग के साथ पेश करने का प्रयास करूंगा। – Pshemo

+2

इसके अलावा, 'getVal()' को किसी विधि को कॉल न करें जिसे कुछ भी नहीं मिलता है, लेकिन इसके बजाय प्रिंट करता है। गेटर्स और सेटर्स जावा में एक अच्छी तरह से स्थापित सम्मेलन हैं, और आपकी getVal() विधि को गेटर की तरह नामित किया गया है, लेकिन यह एक नहीं है। यदि यह गेटटर था, तो वह संबंधित सेटर विधि ('setVal() ') द्वारा निर्धारित किया गया था। –

उत्तर

4

आपका बहुरूपता उदाहरण की तर्ज पर कुछ होगा केवल ओवरलोडिंग विधि है और है कि वास्तव में क्या ऑब्जेक्ट ओरिएंटेड लोगों बहुरूपता से इसका मतलब यह नहीं है। उनका मतलब है कि आप एक इंटरफ़ेस कैसे प्राप्त कर सकते हैं जो एक विधि का खुलासा करता है, और विभिन्न classes जो लागू करता है interface विभिन्न व्यवहार करने के लिए विधि को कार्यान्वित कर सकता है।

this देखें। विशेष रूप से परिचय का अंतिम अनुच्छेद।

इसके अलावा, मैं सुझाव दूंगा कि कोड में बहुरूपता के ज्ञान को प्रदर्शित करने का सबसे अच्छा तरीका आवश्यक रूप से कुछ क्लाइंट कोड शामिल करेगा जो यह प्रदर्शित करने के लिए बहुरूप वस्तुओं का उपयोग करता है कि वे अलग-अलग हो सकते हैं, यानी पॉली, व्यवहार।

+0

यह इसे बहुत स्पष्ट बनाता है; मैं अब अंतर समझता हूं। धन्यवाद! – user2048643

4

योग्य कुछ बातें:

  • मनुष्य विधि मान चाहिए।
  • ओवरलोडिंग ओवरराइडिंग से अलग है। बहुरूपता प्रदर्शित करने के लिए आप शायद अपने बच्चे वर्ग में setVal() (या शायद कुछ और उपयुक्त विधि) को ओवरराइड करना चाहते हैं।

नीचे दिए गए उदाहरण देखें। अभिभावक fooMethod() लागू करता है। माता-पिता fooMethod (स्ट्रिंग स्ट्र) जोड़कर fooMethod() को ओवरलोड करता है। इन्हें दो अलग, पूरी तरह से असंबंधित तरीकों के रूप में सोचें - वे बहुत ही समान दिखने वाले नाम होते हैं। ओवरलोडिंग में बहुरूपता के साथ कुछ भी नहीं है।

तब बच्चा अभिभावक को बढ़ाता है। बच्चे को शुरुआत में माता-पिता से fooMethod प्राप्त होता है, लेकिन जब fooMethod() कहा जाता है तो यह विभिन्न कार्यक्षमता चाहता है। इसलिए बच्चे अपने कार्यान्वयन के साथ fooMethod() को ओवरराइड करता है। अब जब बच्चे का ऑब्जेक्ट fooMethod() को कॉल करता है, तो fooMethod() का चाइल्ड वर्जन चलाया जाएगा, "बार" प्रिंटिंग, "foo" नहीं।

public class Parent { 
    public void fooMethod() { 
    System.out.println("foo"); 
    } 

    public void fooMethod(String str) { // overloading Parent.fooMethod() 
    System.out.println("foo " + str); 
    } 
} 


public class Child extends Parent { 
    public void fooMethod() { 
    System.out.println("bar"); // overriding Parent.fooMethod() 
    } 
} 
1

ओवरराइडिंग का आपका उदाहरण गलत है (जैसा कि, पॉलिमॉर्फिज्म का प्रदर्शन नहीं करता है)।

आप विभिन्न हस्ताक्षरों के साथ दो कार्य दिखाते हैं (तर्क के प्रकार फ़ंक्शन हस्ताक्षर का हिस्सा हैं)। सिर्फ इसलिए कि उनके पास एक ही नाम है, उन्हें ओवरराइडिंग का उदाहरण नहीं देता है।

अधिभावी अगर वर्ग बच्चे की तरह

public void setVal(int x){ 
    a = x+10; 
} 

कुछ है जो अपनी सुपर (पैरेंट) कक्षा में setVal (int) विधि ओवरराइड होता था होगा।

तथापि बहुरूपता प्रदर्शित करने के लिए एक बेहतर तरीका

Parent guy = new Child(); 
guy.getVal(); 
1
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class Parent_1 
{ 
    private int i;//encap 
    private int j; 

    public void display() {    
     System.out.println("these are the 2 answer"); 
    } 
} 

class child extends Parent_1 //inher 
{ 
    public void display() //method overiding 
    { 
     System.out.println("this is for method overriding"); 
    } 

    public void mul(int i, int j) 
    { 
     int k=i*j; 
     System.out.println("mul of 2 int val is:"+k); 
    } 

    public void mul(double i,double j) //poly 
    { 
     double z=i*j; 
     System.out.println("mul val of 2 double is:"+z); 
    } 
} 

class Son 
{ 
    public static void main(String args[]) 
    { 
     Parent_1 p=new Parent_1(); 

     Parent_1 pt=new child(); 
     child cd=new child(); 
     p.display(); 
     cd.mul(2, 20); 
     cd.mul(2.2, 1.1); 
     pt.display(); 
    } 
}