একটি "নিয়মিত" অভ্যন্তর শ্রেণীর একটি বহিরাগত শ্রেণীর উদাহরণের জন্য একটি লুকানো (অন্তর্নিহিত) পয়েন্টার থাকে। এটি সংকলকটি আপনাকে টাইপ না করে পয়েন্টারটিকে তাড়া করতে কোড উত্পন্ন করতে সহায়তা করে। উদাহরণস্বরূপ, যদি বাইরের শ্রেণিতে "a" পরিবর্তনশীল থাকে তবে আপনার অভ্যন্তর শ্রেণীর কোডটি কেবল "a = 0" করতে পারে, তবে সংকলক "বহিরাগত পয়েন্টার.এ = 0" এর জন্য গোপন পয়েন্টারটি বজায় রাখার জন্য কোড উত্পন্ন করবে কভার।
এর অর্থ আপনি যখন কোনও অভ্যন্তর শ্রেণীর উদাহরণ তৈরি করেন আপনার সাথে এটির লিঙ্ক করার জন্য কোনও বহিরাগত শ্রেণীর উদাহরণ থাকতে হবে। আপনি যদি বাহ্যিক শ্রেণীর কোনও পদ্ধতির ভিতরে এই সৃষ্টিটি করেন তবে সংকলক অন্তর্ভুক্ত পয়েন্টার হিসাবে "এটি" ব্যবহার করতে জানে। আপনি যদি অন্য কোনও বাহ্যিক উদাহরণের সাথে লিঙ্ক করতে চান তবে আপনি একটি বিশেষ "নতুন" বাক্য গঠন ব্যবহার করুন (নীচের কোড স্নিপেট দেখুন)।
আপনি যদি নিজের অভ্যন্তর শ্রেণিকে "স্থিতিশীল" করেন তবে কোনও গোপন পয়েন্টার নেই এবং আপনার অভ্যন্তর শ্রেণি বাইরের শ্রেণীর সদস্যদের উল্লেখ করতে পারে না। একটি স্থিতিশীল অভ্যন্তর শ্রেণি নিয়মিত শ্রেণীর মতো, তবে এর নামটি পিতামাতার অভ্যন্তরে sc
এখানে কোডের একটি স্নিপেট রয়েছে যা স্থির এবং অ স্থিতিশীল অভ্যন্তর শ্রেণি তৈরির জন্য সিনট্যাক্স প্রদর্শন করে:
public class MyClass {
int a,b,c; // Some members for MyClass
static class InnerOne {
int s,e,p;
void clearA() {
//a = 0; Can't do this ... no outer pointer
}
}
class InnerTwo {
//MyClass parentPointer; Hidden pointer to outer instance
void clearA() {
a = 0;
//outerPointer.a = 0 The compiler generates this code
}
}
void myClassMember() {
// The compiler knows that "this" is the outer reference to give
// to the new "two" instance.
InnerTwo two = new InnerTwo(); //same as this.new InnerTwo()
}
public static void main(String args[]) {
MyClass outer = new MyClass();
InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer
InnerOne y = new InnerOne(); // a "static" inner has no hidden pointer
InnerOne z = new MyClass.InnerOne(); // In other classes you have to spell out the scope
}
}