आपके पास कुछ मामूली समस्याएं हैं। आपने एक टिप्पणी में उल्लेख किया है कि आपके पास सी के साथ कुछ अनुभव है, इसलिए मैं कुछ बुनियादी अनुरूपताओं को आकर्षित करने की कोशिश करूंगा। एक static
विधि (जैसे main
) सामान्य सी फ़ंक्शन की तरह व्यवहार करती है। एक गैर-static
विधि, हालांकि, एक छिपी पैरामीटर लेता है: this
, जो ऑब्जेक्ट पर संदर्भित करता है जिस पर वह विधि संचालित होती है। जब आप इस जैसे एक विधि लिखें:
private void swapMe(VeryBasicJava this, int a, int b){
// ^^^^^^^^^^^^^^^^^^^^
// ...
क्योंकि this
पैरामीटर विशेष रूप से व्यवहार किया जाता है, वहाँ पर गैर static
तरीकों फोन करने के लिए एक विशेष वाक्य रचना है:
private void swapMe(int a, int b) {
// ...
यह वास्तव में कुछ इस तरह का मतलब वस्तुओं:
myInstance.swapMe(someA, someB);
// ^^^^^^^^^^ ^^^^^ ^^^^^
// this a b
और क्योंकि swapMe
static
घोषित नहीं है, यह अब की तरह कहा जा करने की उम्मीद ove।
तथ्य यह है कि main
VeryBasicJava
वर्ग के अंदर घोषित किया जाता है इसका मतलब यह नहीं है कि आप स्वचालित रूप से एक VeryBasicJava
वस्तु है।फिर, क्योंकि main
static
है, यह सिर्फ एक साधारण सी समारोह की तरह है:
void VeryBasicJava_main(...) {
// ...
आदेश में को एक वस्तु का एक उदाहरण बनाने के लिए, आप new
का उपयोग करें:
VeryBasicJava vbj = new VeryBasicJava();
इस के अनुरूप है सी में malloc
:
VeryBasicJava *vbj = malloc(sizeof(VeryBasicJava));
VeryBasicJava_construct(vbj);
एक उदाहरण के साथ, आप एक विधि आह्वान कर सकते हैं:
vbj.swapMe(spam, eggs);
आपका अन्य मुद्दा दोहरा है: में से एक गुंजाइश, और के सदस्यों। जैसा कि आप जानते हैं, दायरा को संदर्भित करता है जहां एक चर मौजूद है। इस समारोह लें:
1: private void swapMe(int a, int b) {
2: int a;
3: int b;
4: int tmp = a;
5: this.a = b;
6: this.b = a;
7: }
जब इस विधि कहा जाता है, तो निम्न बातें होती हैं:
a
और b
बनाई गई हैं, मूल्यों swapMe
करने के लिए कॉल में निर्दिष्ट दिया।
एक नया a
डिफ़ॉल्ट मूल्य 0
के साथ swapMe
पर स्थानीय बनाया गया है। यह a
छिपा पैरामीटर a
, और उन्हें अलग करने का कोई तरीका नहीं है।
एक नया b
भी सख्ती से स्थानीय बनाया गया है। इसमें भी डिफ़ॉल्ट 0
मान है, और पैरामीटर b
को छुपाता है।
tmp
बनाया गया है, और इसका मूल्य नव घोषित a
पर सेट है, इसलिए यह भी 0
है।
, [ नीचे देखें]
[ नीचे देखें]
स्थानीय लोगों a
और b
संघर्ष अस्तित्व के लिए के रूप में मानकों a
और b
है।
लाइनों 5 और 6, आप वाक्य रचना this.a
उपयोग करने के लिए नहीं बल्कि पैरामीटर से स्थानीय a
का उल्लेख करने का प्रयास। यद्यपि जावा में यह वाक्यविन्यास मौजूद है, लेकिन यह आपके द्वारा किए जाने वाले कार्यों का पालन नहीं करता है। पैरामीटर्स को स्थानीय चर के समान ही माना जाता है, इसलिए उन दो श्रेणियों के बीच अंतर करने की बजाय this.a
स्थानीय और सदस्यों के बीच अंतर करता है। अब, सदस्य क्या हैं?ठीक है, का कहना है कि अपने वर्ग घोषणा चर घोषणाओं में शामिल हैं:
class VeryBasicJava {
private int a;
private int b;
// ...
}
यह एक सी struct
में सिर्फ सदस्य घोषणाओं की तरह है:
struct VeryBasicJava {
int a;
int b;
};
क्या इसका मतलब यह है कि जब आप VeryBasicJava
का एक उदाहरण बनाने के लिए:
VeryBasicJava vbj = new VeryBasicJava();
उस उदाहरण के अपने चर a
और b
हैं, जिनका उपयोग किसी भी में किया जा सकता है गैर static
विधि:
public void print() {
System.out.println("a is " + a);
System.out.println("b is " + b);
}
आप एक सदस्य के रूप में एक ही नाम के साथ एक स्थानीय चर है, तो आप this
का उपयोग करना चाहिए जो स्पष्ट रूप से करने के लिए है कि आप सदस्य का उल्लेख करना चाहते हैं। यह पूरा कार्यक्रम सदस्यों और स्थानीय लोगों के बीच घोषित करने, उपयोग करने और अंतर करने का तरीका बताता है।
class VeryBasicJava {
private int a;
private int b;
private int c;
public static void main(String[] args) {
VeryBasicJava vbj = new VeryBasicJava();
vbj.a = 3;
vbj.b = 4;
vbj.c = 5;
vbj.print(1);
}
public void print(int a) {
int b = 2;
System.out.println("a is " + a);
System.out.println("b is " + b);
System.out.println("c is " + c);
System.out.println("this.a is " + this.a);
System.out.println("this.b is " + this.b);
System.out.println("this.c is " + this.c);
}
}
यह इस उत्पादन का उत्पादन होगा:
a is 1
b is 2
c is 5
this.a is 3
this.b is 4
this.c is 5
मुझे आशा है कि इन उदाहरणों और स्पष्टीकरण सहायक होते हैं।
अच्छा सवाल है कि बहुत से शुरुआती जावा प्रोग्रामर इस माध्यम से जाते हैं:) – Shawn
अच्छा सवाल है कि ज्यादातर लोग केवल कोड प्रदान करेंगे और वास्तव में यह नहीं बताएंगे कि क्या हो रहा है। – Nicholas
क्या लोग * उदाहरण * देना बंद कर सकते हैं? प्रश्नकर्ता को कामकाजी कोड की आवश्यकता नहीं है, उसे ऑब्जेक्ट उन्मुख प्रोग्रामिंग अवधारणाओं को समझाने के लिए किसी की जरूरत है। – deworde