为什么我无法访问受保护的java方法,即使我已经扩展了该类?
-
06-07-2019 - |
题
这是受保护方法的文档:
/** 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;
}
}
解决方案
(编辑: 他们称之为记忆的答案 给出了避免您遇到此问题的实用建议。这个答案给出了您必须遵循该建议的原因,即为什么语言是这样设计的。)
您只能访问与访问代码(或子类)类型相同的另一个对象的受保护成员 - 即使该成员是 宣布 在超类型中。
令C为宣布受保护成员M的类。仅允许进入C的一个子类的体内。另外,如果ID表示实例字段或实例方法,则:
- 如果访问是通过合格的名称q.id,其中q是一个expressionName,则允许访问访问,并且仅当extession q的类型是S或S的类型。
- 如果访问是通过字段访问表达式E.ID,则e为主表达式或通过方法调用表达式e.id(。。。
这是为了允许类型访问与其自己的继承树相关的成员,而不破坏其他类的封装。例如,假设我们有:
A
/ \
B Other
/
C
并且 A 声明为受保护成员 x
. 。如果规则不按其方式工作,您可以通过将成员放入 Other
:
public int getX(A a)
{
return a.x;
}
并只是在实例中调用它 B
或者 C
- 该成员将有效地公开,因为您总是可以通过引入另一个类来解决它......这不是一个好主意。根据当前规则,您必须子类化 B
或者 C
- 你可能一开始就无法做到这一点。
其他提示
通过这样做:
MidiSynth synth = new MidiSynth();
sequence = synth.scoreToSeq(score);
你实际上没有利用你扩展MidiSynth类的事实。
如果你要尝试
this.scoreToSec(score);
然后你会发现你可以访问受保护的功能。
不隶属于 StackOverflow