为什么在子类中无法通过超类实例访问受保护的成员?

我观察到 protected 个成员的一些奇怪的(对我而言)行为。

也就是说,我当然了解 package-privateprotected 之间的主要区别,即 package-private + 从子类访问,不考虑后者的包。

虽然,我已经观察到:

  • protected 超类的成员,可以通过继承在子类中访问(就像将成员定义到子类中一样);
  • protected 超类的成员,可通过子类实例访问(但只能在子类范围内,而不是在其他地方创建的子类实例);
  • X protected 超类的成员,通过在子类中创建的超类实例不可访问;但是,如果受保护的成员是 static,那么它可以在超类和子类定义上访问,并且可以在任何地方访问(在子类实例上访问受保护的实例成员时,在子类本身之外,情况并非如此) .

我知道,这一切读起来可能有点乱,但这也是我现在的感觉 - 一团糟。我以为我已经了解了 protected 修饰符的所有深层细节,但似乎有些事情让我有点困惑。

package com.package1;

public class SuperClass {

    protected void protectedMethod() {
    }


    protected static void staticProtectedMethod() {
    }

}
package com.package2;

import com.package1.SuperClass;

public class SubClass extends SuperClass {
    
    public static void subClassStaticMethod() {
        staticProtectedMethod(); //OK
    }
    
    public void subClassInstanceMethod() {

        protectedMethod(); //inheritance,compiles OK
        
        new SubClass().protectedMethod(); //Compiles OK

        //but
        new SuperClass().protectedMethod(); //Does NOT compile..
        
        //although with respect to static protected members,both work fine:
        SuperClass.staticProtectedMethod(); //OK
        SubClass.staticProtectedMethod(); //OK
    }
}

请澄清一下?

为什么语言设计限制了对超类的受保护成员访问?

为什么 static 成员表现出不同的行为并允许在子类和超类上访问受保护的成员?

为什么不能在子类之外的子类上访问受保护的成员?

我对 protected 访问修饰符的理解缺少什么?

thebestme_1 回答:为什么在子类中无法通过超类实例访问受保护的成员?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/88972.html

大家都在问