CodeQL 文档

继承方法的微妙调用

ID: java/subtle-inherited-call
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - reliability
   - readability
Query suites:
   - java-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

如果从内部类 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.printMessagesuper.printMessage 替换,具体取决于要调用的方法。要保留示例中的行为,请使用 super.printMessage

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私