继承方法的微妙调用¶
ID: java/subtle-inherited-call
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- reliability
- readability
Query suites:
- java-security-and-quality.qls
如果从内部类 A 调用一个方法,并且该名称的方法在 A 的超类和 A 的外部类中都被定义,那么程序员不清楚要调用哪个方法。
示例¶
在以下示例中,不清楚对 printMessage
的调用是调用在 Outer
中定义的方法还是在 Super
中定义的方法。
public class Outer
{
void printMessage() {
System.out.println("Outer");
}
class Inner extends Super
{
void ambiguous() {
printMessage(); // Ambiguous call
}
}
public static void main(String[] args) {
new Outer().new Inner().ambiguous();
}
}
class Super
{
void printMessage() {
System.out.println("Super");
}
}
继承的方法优先于外部类中的方法,因此调用超类中的方法。但是,这种情况可能是造成混淆和缺陷的潜在原因。
建议¶
通过显式限定方法调用来消除歧义
要指定外部类,请在方法前面加上
Outer.this.
。要指定超类,请在方法前面加上
super.
。在上面的示例中,对printMessage
的调用可以用Outer.this.printMessage
或super.printMessage
替换,具体取决于要调用的方法。要保留示例中的行为,请使用super.printMessage
。
参考¶
内部类规范:什么是顶级类和内部类?.