override کردن و دید در جاوا

درحالیکه override کردن در جاوا خیلی سرراست به نظر میرسد، ریزهکاریهایی هم دارد که به یکی از آنها در این مطلب اشاره میکنیم.
تابعی که در کلاس پدر است میتواند تابعی دیگر از کلاس پدر یا یک تابع از کلاس فرزند را صدا بزند، که بستگی به دید(visibility) این توابع دارد.
دو کلاس زیر را در نظر بگیرید.
public class SuperClass { public String a() { return b(); } public String b() { return c(); } public String c() { return "superclass"; } } public class Subclass extends SuperClass { public String a() { return b() + b(); } public String c() { return "subclass"; } }
new SuperClass().a()i چیزی که برمیگرداند superclass است و new SubClass().a()i خروجی subclass subclass را دارد.
اگر دید متد c() کلاس پدر را به private تغییر دهیم:
new SuperClass().a()i چیزی که برمیگرداند superclass است اما new SubClass().a()i خروجی superclasssuperclass را دارد.
در واقع اگر کلاس پدر روی متد c() کلاس فرزند دید داشته باشد، متد b() کلاس پدر پیادهسازی کلاس فرزند را برمیگرداند و درغیراینصورت همان پیادهسازی کلاس پدر را برمیگرداند.
مسلما اگر b() را هم در کلاس فرزند override کنیم، باز هم شرایط فرق میکند. در این شرایط new subClass().a()i در همه حال، بدون توجه به دید متد c()، خروجی subclasssubclass را برمیگرداند.
منبع:
اگر دید متد c() کلاس پدر را به private تغییر دهیم:
این خط اشتباه نشده ؟؟؟؟
فکر میکنم منظورش این بود که اگر دید متد c() کلاس فرزند را به private تغییر دهیم
توی منبع این مطلب هم مشخص نکرده که منظورش از متد c() کدومشه
ولی فکر میکنم منظورش کلاس فرزند هستش چون گفته :
اگر کلاس پدر روی متد c() کلاس فرزند دید داشته باشد، متد b() کلاس پدر پیادهسازی کلاس فرزند را برمیگرداند و درغیراینصورت همان پیادهسازی کلاس پدر را برمیگرداند.
درسته در منبع اصلی ذکر نشده بود
اما دقت کنید نمیتواند منظور کلاس فرزند باشد. چرا که متد c از کلاس پدر override شده و نمیتواند visibility آن در کلاس فرزند کاهش پیدا کند. کد داده شده را با توضیحاتی که ذکر کردم اجرا کنید جواب گفته شده را میگیرید.