بصورت پیشفرض متغیر سراسری کلاس private ئه مگر اینکه صریحا مشخص کنید، مثلا x اینجا یک متغیر سراسری private ئه :
و با این فرقی نداره :
کد:
class Class1
{
[B][COLOR=#0000FF]private[/COLOR][/B] int x;
}
و متغیر سراسری private از بیرون کلاس دیده نمی شود، حالا چه برای کلاس فرزند و چه سایر محیط ها.
و مقدار اولیه متغیر های سراسری مقدار پیشفرض نوع داده اونها است، مگر اینکه صریحا مقدار دهی شون کنید، مثلا مقدار پیشفرض int ها صفر ئه، پس مشابه این خواهد بود :
کد:
class Class1
{
private int x [B][COLOR=#0000FF]= 0[/COLOR][/B];
}
و اینم یه متغیر سراسری private از نوع کلاس Class1 است و مقدار اولیه اش null است، مقدار پیشفرض انواع داده ای که با شیء سر و کار دارند null است :
کد:
class Class1
{
Class3 a;
}
و این یک متغیر سراسری public از نوع کلاس Class3 است که مقدار اولیه اش یک شیء از همون نوع است :
کد:
class Class1
{
public Class3 a = new Class3();
}
و متغیر سراسری public از بیرون کلاس قابل مشاهده است، چه فرزند اش باشد و چه نباشد.
هم namespace و هم class ها ساختار سلسله مراتبی رو می پذیرند، همانطور که if و for و سایر بلوک ها می توانند تو در تو باشند.
می توانید داخل یک کلاس کلاس دیگری و داخل فضای نام ای فضای نام دیگری را تعریف کنید.
در هر دو مورد وقتی داخل هم قرار می گیرند ترکیب شون با نقطه انجام میشه، یعنی اگر نام کامل شون رو بخواهید یک کاراکتر . بین شون قرار می گیره، فرضا اگر کلاس B رو داخل کلاس A تعریف کنید، خارج از کلاس A کلاس B رو با نام A.B می شناسند.
همانطور که اگر فضای نام B رو داخل فضای نام A تعریف کنید، مواردی که داخل B می نویسید در فضای نام A.B قرار دارند.
کد:
public class Class1
{
public class Class3
{
}
}
public class Class2
{
public class Class3
{
}
}
public class Test
{
[B][COLOR=#0000FF]Class1.Class3[/COLOR][/B] x;
[B][COLOR=#0000FF]Class2.Class3[/COLOR][/B] y;
}
و نکته اینجا است که Class3 با توجه به جایی که به آن اشاره می شود کلاس متفاوتی است، Class1.Class3 و Class2.Class3 دو کلاس کاملا متفاوت اند.
در داخل MyClass1 که نیازی به اشاره به خود MyClass1 نیست :
کد:
MyClass2 a = new MyClass2();
a.meth();
اما خارج از بدنه MyClass1 باید مشخص کنید که کلاس MyClass2 شما در MyClass1 تعریف شده :
کد:
MyClass1.MyClass2 x = new MyClass1.MyClass2();
x.meth();
نه چنین منظوری ندارم، همانطور که خودتان دیدید وقتی شما در کلاس میانی برای فرزند متد رو به نوع دیگری override می کنید نه فقط برای اون کلاس، برای فرزندان کلاس هم چنین روالی رو قرار می دهید. اگر قرار بود که فرزندان کلاس همچنان با متد پدربزرگ درگیر بودند که
اصلا override کردن کلاس میانی نادیده گرفته شده بود.
شما در کلاس پدر نوشته اید private new ، اون private یعنی فقط برای این کلاس متد جدیدی می نویسم و به فرزندانم ربطی ندارند. فرزندان اصلا متد private را نمی بینند که در ارتباط شان تاثیری داشته باشد.
اگر می نوشتید public new ، همانطور که در مثال حقیر وجود داشت، آنوقت قضیه کاملا فرق می کرد.