当前位置: 首页 > 面试题库 >

为什么什至以为我已经扩展了类,为什么我不能访问受保护的Java方法?

张茂勋
2023-03-14
问题内容

这是受保护方法的文档:

/** Converts jmusic score data into a MIDI Sequence */
protected  javax.sound.midi.Sequence scoreToSeq(Score score)

我制作了这个小类来扩展scoreToSeq方法来自的类:

public class MidiSequence extends MidiSynth{

    public Sequence getSequence(Score score){
        MidiSynth synth = new MidiSynth();
        Sequence sequence = null;
        try
        {
                    // Here I get the error saying that the method has
                    // protected access in MidiSynth
            sequence = synth.scoreToSeq(score);

        }
        catch (InvalidMidiDataException e)
        {
            /*
             *  In case of an exception, we dump the exception
             *  including the stack trace to the console.
             *  Then, we exit the program.
             */
            e.printStackTrace();
            System.exit(1);
        }

        return sequence;

    }
}

问题答案:

(编辑:他们callmemorty的答案提供了在您的情况下避免该问题的实用建议。此答案提供了您为什么必须遵循该建议的原因,即,为什么语言是这样设计的。)

您只能访问与访问代码(或子类)具有相同类型的另一个对象的受保护成员,即使该成员是在超类型中 声明 的也是如此。

根据Java语言规范的第6.6.2节:

令C为声明受保护成员m的类。仅在C的子类S的主体内允许访问。此外,如果Id表示实例字段或实例方法,则:

  • 如果通过限定名称Q.Id(其中Q是ExpressionName)进行访问,则且仅当表达式Q的类型为S或S的子类时,才允许访问。
    * 如果通过字段访问表达式E.Id(其中E是主表达式)或通过方法调用表达式E.Id(…)(其中E是主表达式)进行访问,则仅当且仅当允许访问时,如果E的类型是S或S的子类。


这是为了允许一个类型访问与其自己的继承树相关的成员,而不会破坏其他类的封装。例如,假设我们有:

     A
    / \
   B   Other
  /
 C

并且A宣布为受保护成员x。如果没有按规则进行操作,则可以通过将成员放在以下位置来进行圆形封装Other

public int getX(A a)
{
    return a.x;
}

而只是调用,传递的一个实例BC-该成员将有效地成为公众,因为你总是可以通过引入其他类…不是一个好主意,解决它。使用当前规则,您必须首先继承-
BC-可能无法继承。



 类似资料:
  • 我有一个用Java Spring MVC构建的web应用程序,并使用Spring Security进行登录。登录/退出工作很好。有两个用户角色“role_admin”和“role_user”。 我想确保我的方法只能由具有“role_admin”角色的用户访问。 我添加了批注,如下所示...

  • 问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚

  • 问题内容: 在Java中,为什么不能在接口中使用受保护的方法? 由于根据Java规范 受保护的访问(由关键字protected表示)-同一包中任何类型以及任何包中的子类均可访问的字段或方法。 如果我必须使用该接口,那么我将实现它并覆盖方法。因此,如果我要实现类可以访问这些方法的位置,因为该方法可以在任何包中访问。那么,将方法声明为Interface中的保护有什么害处? 问题答案: 受保护的方法旨在

  • 当我用公共方法重写受保护的方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法?

  • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严

  • 我在Java中使用嵌套类时遇到问题,有人知道为什么Java不允许我这样做吗?