नहीं, उन्हें यह विरासत में नहीं मिला है।
तथ्य यह है कि कुछ अन्य वर्ग इसका उपयोग अप्रत्यक्ष रूप से विरासत के बारे में कुछ नहीं कहते हैं, लेकिन इनकैप्सुलेशन के बारे में कर सकते हैं।
उदाहरण के लिए:
class Some {
private int count;
public void increment() {
count++;
}
public String toString() {
return Integer.toString( count );
}
}
class UseIt {
void useIt() {
Some s = new Some();
s.increment();
s.increment();
s.increment();
int v = Integer.parseInt( s.toString() );
// hey, can you say you inherit it?
}
}
आप प्रतिबिंब के माध्यम से count
अंदर का मूल्य भी प्राप्त कर सकते हैं UseIt
। इसका मतलब यह नहीं है, आप इसे विरासत में मिला है।
अपडेट करें
मान होने पर भी, यह उपवर्ग द्वारा विरासत में नहीं मिला है।
उदाहरण के लिए एक उपवर्ग के रूप में परिभाषित:
class SomeOther extends Some {
private int count = 1000;
@Override
public void increment() {
super.increment();
count *= 10000;
}
}
class UseIt {
public static void main( String ... args ) {
s = new SomeOther();
s.increment();
s.increment();
s.increment();
v = Integer.parseInt( s.toString() );
// what is the value of v?
}
}
यह पहले उदाहरण के समान ही स्थिति है। विशेषता count
छिपी हुई है और उपवर्ग द्वारा विरासत में नहीं मिली है। फिर भी, जैसा कि DigitalRoss बताता है, मान है, लेकिन उत्तराधिकार के माध्यम से नहीं है।
इस तरह से रखो। यदि आपका पिता धनवान है और आपको क्रेडिट कार्ड देता है, तब भी आप उसके पैसे से चीज़ खरीद सकते हैं, लेकिन इसका मतलब यह नहीं है कि आपको वह सारा पैसा विरासत में मिला है?
अन्य अपडेट
हालांकि, यह जानना बहुत दिलचस्प है कि विशेषता क्यों है।
मुझे स्पष्ट रूप से इसका वर्णन करने के लिए सटीक शब्द नहीं है, लेकिन यह जेवीएम है और जिस तरह से यह काम करता है वह "मूल नहीं" मूल परिभाषा को भी लोड करता है।
हम वास्तव में माता-पिता को बदल सकते हैं और उपवर्ग अभी भी काम करेंगे।
उदाहरण के लिए :
//A.java
class A {
private int i;
public String toString() { return ""+ i; }
}
// B.java
class B extends A {}
// Main.java
class Main {
public static void main( String [] args ) {
System.out.println( new B().toString() );
}
}
// Compile all the files
javac A.java B.java Main.java
// Run Main
java Main
// Outout is 0 as expected as B is using the A 'toString' definition
0
// Change A.java
class A {
public String toString() {
return "Nothing here";
}
}
// Recompile ONLY A.java
javac A.java
java Main
// B wasn't modified and yet it shows a different behaviour, this is not due to
// inheritance but the way Java loads the class
Output: Nothing here
मुझे लगता है कि सटीक शब्द यहां पाया जा सकता है: JavaTM वर्चुअल मशीन विशिष्टता