Java Modifiers
Modifiers ऐसे keywords होते हैं जिन्हें हम किसी भी definitions में उनके अर्थ बदलने के लिए जोड़ते हैं।
Java मॆ modifiers को दो groups में विभाजित किया गाया हैं।
- Access Modifiers
- Non-Access Modifiers
Access Modifiers
अब तक हमने कई बार public
keyword का इस्तेमाल देखा है, लगभग हमारे हरेक उदाहरण
में। public
एक access modifier है, इसका मतलब है कि इसका इस्तेमाल किसी classes,
attributes, methods और constructors के access कि स्तर निर्धारित करने के लिए किया जाता है।
हम किसी भी classes, attributes, methods और constructors के access level को बदल सकते हैं उन पर access modifier को लागू करके।
जावा मॆ चार प्रकार के access modifiers होते हैं:
- Public : public modifier का access level हर जगह है। इसे class के अंदर और class के बाहर, तथा package के अंदर और package के बाहर से access किया जा सकता हैं।
- Protected : protected access modifier का access level, package के अंदर और बाहर दोनों है। लेकिन इसे package के बाहर से केवल inheritance के माध्यम से ही access किया जा सकता हैं।
- Default : default access modifier का मतलब है कि हम class, field, method, etc. के लिए access modifier को स्पष्ट रूप से घोषित नहीं करते हैं।
- Private : private modifier का access level केवल घोषित class के अंदर ही है। इसे class के बाहर से एक्सेस नहीं किया जा सकता है।
Public
public घोषित एक class, method, constructor, interface आदि को किसी भी अन्य class से access किया जा सकता है। इसलिए, public class के अंदर घोषित fields, methods, blocks को जावा से संबंधित किसी भी class से एक्सेस किया जा सकता है।
हालाँकि, यदि हम किसी ऐसा public class तक पहुँचने का प्रयास कर रहे हैं, जो एक अलग ही package में है, तो हमे public class को import करने की आवश्यकता पड़ती है। class inheritance के सहायता से, किसी भी class के सभी public methods और variables इसके subclasses द्वारा विरासत में मिल जाता हैं।
नीचे class और package के अंदर public access modifier का उदाहरण दिया गया है।
package testapplication;
public class Animals {
public static void main(String[] args) {
System.out.println("Animals can run");
}
}
// Result: Animals can run
package testapplication;
class Animals {
public void eatMethod() {
System.out.println("Animals eats: within Package");
}
}
class Dog {
public static void main(String[] args) {
Animals objDog = new Animals();
objDog.eatMethod();
}
}
// Result: Animals eats: within Package
Protected
Variables, methods और constructors जिन्हें superclass में protected घोषित किया जाता है, उन्हें केवल उसी package में और अन्य package मे subclasses द्वारा ही एक्सेस किया जा सकता है। Subclasses और Superclasses के बारे में हम Inheritance चैप्टर में बिस्तार से जानेंगे।
Protected access modifier को class और interfaces पर लागू नहीं किया जा सकता है। इसे fields, methods और constructors पर लागू किया जा सकता है।
Fields, methods को protected घोषित किया जा सकता है लेकिन, interface के अंदर methods और fields को protected घोषित नहीं किया जा सकता है।
यह default modifer की तुलना में अधिक accessibility प्रदान करता है।
नीचे class और package के अंदर Protected access modifier का उदाहरण दिया गया है।
package testapplication;
public class Animals {
public static void main(String[] args) {
System.out.println("Animals can run");
}
}
// Result: Animals can run
package testapplication;
public class Animals {
protected void eatMethod() {
System.out.println("Animals eats: within Package");
}
}
class Dog {
public static void main(String[] args) {
Animals objDog = new Animals();
objDog.eatMethod();
}
}
// Result: Animals eats: within Package
उपरोक्त उदाहरण में testapplication पैकेज का Animals क्लास public है, इसलिए इसे पैकेज के बाहर से एक्सेस किया जा सका है। लेकिन इसी पैकेज का eatMethod()
मेथड को protected घोषित किया गया है, इसलिए इसे क्लास के बाहर से Inheritance के जरिए ही एक्सेस किया जा सकता है जिन्हे हम निचे दिए गए उदाहरण में देखेंगे।
package secondpackage;
import testapplication.*;
class NewClass extends Animals {
public static void main(String[] args) {
NewClass myObj = new NewClass();
myObj.eatMethod();
}
}
// Result: Animals eats: within Package
उपरोक्त उदाहरण में Animal
class एक superclass है जिस्की property (गुण) को NewClass
नामक subclasses को विरासत मे मिला हैं।
Default
यदि हम किसी भी modifier का उपयोग नहीं करते हैं, तो इसे खुद ब खुद से default माना जाता है। default modifier केवल package के अंदर ही accessible है। इसे package के बाहर से access नहीं किया जा सकता है। यह private की तुलना में अधिक accessibility प्रदान करता है। लेकिन, यह public और protected की तुलना में अधिक प्रतिबंधात्मक है।
package testapplication;
class Animals {
public static void main(String[] args) {
System.out.println("Animals can run");
}
}
// Result: Animals can run
package testapplication;
class Animals {
void eatMethod() {
System.out.println("Animals eats: within Package");
}
}
class Dog {
public static void main(String[] args) {
Animals objDog = new Animals();
objDog.eatMethod();
}
}
// Result: Animals eats: within Package
नीचे उदाहरण में, हमने दो पैकेज testapplication और secondpackage बनाए हैं। हम Animals
क्लास को उसके पैकेज के बाहर से एक्सेस करने की कोशिश कर रहे हैं, चुकि Animals
क्लास public नहीं है, इसलिए इसे पैकेज के बाहर से एक्सेस नहीं किया जा सकता है।
package testapplication;
import secondpackage.*;
class NewClass extends Animals {
public static void main(String[] args) {
NewClass myObj = new NewClass(); //Compile Time Error
myObj.eatMethod(); //Compile Time Error
}
}
Private
private घोषित किए गए Methods, variables, और constructors केवल घोषित class के अंदर से ही एक्सेस किया जा सकता है।
private access modifier सबसे प्रतिबंधित access level होता है, इसीलिए class और interfaces कभी भी private नहीं हो सकते।
package testapplication;
public class Animals {
private int num = 10;
private void eatMethod() {
System.out.println("Animals eats inside class");
}
public static void main(String[] args) {
Animals myObj = new Animals();
myObj.eatMethod();
System.out.println(myObj.num);
}
}
// Result: Animals eats inside class
// Result: 10
नीचे के उदाहरण में, हमने दो क्लास Animals
और Dog
बनाए हैं। एक क्लास Animals में private variable और private method है। हम इन datas को क्लास के बाहर से एक्सेस करने की कोशिश कर रहे हैं, इसलिए Java एक compile-time error दिखाएगा।
package testapplication;
class Animals {
private int num = 10;
private void eatMethod() {
System.out.println("Animals eats inside class");
}
}
class Dog {
public static void main(String[] args) {
Animals myObj = new Animals();
myObj.eatMethod(); //Compile Time Error
System.out.println(myObj.num); //Compile Time Error
}
}