कोड के निम्नलिखित भाग (कोड 2) पर विचार करें।
abstract class Vehicle{
abstract void park();
}
class Demo{
static class Car extends Vehicle {
int speed;
void park(){
System.out.println("Parking for cars...");
}
}
public static void main(String args[]){
Vehicle v1=new Car();
v1.park();
}
}
यह कोई आश्चर्य की बात नहीं है कि कोड का पिछला भाग कोई कंपाइलर त्रुटि नहीं देता है।
कार विस्तारित वाहन और कार अमूर्त नहीं है। इसलिए आप इसे तुरंत चालू कर सकते हैं।
देखते हैं जब कोड 2 संकलित पर क्या होता है:
javac *.java
list .class files
Demo$Car.class Demo.class Vehicle.class
और यह जब प्रश्न में कोड (कोड 1) संकलित किया गया है तो:
javac *.java
list .class files
Demo$1.class Demo.class Vehicle.class
हम एक ही मिलता है सिवाय हम कोड 1 में डेमो $ 1. क्लास प्राप्त करते हैं और कोड 2 में डेमो $ Car.class प्राप्त करते हैं।
ऐसा इसलिए होता है क्योंकि कोड 1 वास्तव में वाहन से विरासत में प्राप्त कक्षा बना रहा है। एक तथाकथित अज्ञात वर्ग। कक्षा का कोई नाम नहीं है (*) लेकिन यह अभी भी एक पूर्ण श्रेणी है जो वाहन से विरासत में आता है और तुरंत तत्काल किया जा सकता है जैसे कार को तत्काल किया जा सकता है।
इस कोड:
Vehicle v1=new Vehicle(){
वर्ग वाहन की एक वस्तु instantiating नहींहै। यह उस वर्ग की वस्तु को तत्काल कर रहा है जो वाहन से विरासत में है जिसका कोई नाम नहीं है।
(*) असल में इसका नाम है। इसका नाम "डेमो में 1" उर्फ डेमो $ 1 है। JVM को इसे चलाने में सक्षम होने के लिए एक नाम की आवश्यकता है, आप केवल जेवीएम को यह बताए बिना कुछ चलाने के लिए नहीं बता सकते कि उसे क्या चलाना है। नाम वह है जो कक्षा के लिए एक सैंटैक्टिक रूप से वैध नाम नहीं है; कक्षा को 1 के रूप में नामित नहीं कर सकता है। यह डेसिन द्वारा है क्योंकि यह सुनिश्चित करता है कि बेनामी वर्ग के नाम सामान्य श्रेणी के नामों से संघर्ष नहीं करेंगे।
स्रोत
2015-09-05 06:21:56
आप शामिल करना चाहते हैं कि आपके टर्मिनल कमांड केवल * निक्स सिस्टम के लिए हैं। –
ठीक है, यह स्पष्ट करेगा। यद्यपि जेवीके के साथ किसी भी मंच पर जावैक आम है। –