Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Parasoft Jtest 2021.1

Wiki MarkupWhen a class declares a static method _m_, the declaration of _m_ hides any method _ m'_, where the signature of _m_ is a subsignature of the signature of _ m' _ and the declaration of _ m' _ is both in the superclasses and superinterfaces of the declaring class and also would otherwise be accessible to code in the declaring class (_The Java Language Specification_, [§8, §8.4.8.2 "Hiding (by Class Methods)"|http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.8.2]\[[JLS 2005|AA. Bibliography#JLS 05]\ [JLS 2015]).

An instance method defined in a subclass overrides another instance method in the superclass when both have the same name, number and type of parameters, and return type.

...

Noncompliant Code Example

In this noncompliant code example, the programmer hides the static method rather than overriding it. Consequently, the code invokes the displayAccountStatus() method of the superclass at two different call sites instead of invoking the superclass method at one call site and the subclass method at the other, causing it to print  Account details for admin despite being instructed to choose user rather than admin.

Code Block
bgColor#FFCCCC

class GrantAccess {
  public static void displayAccountStatus() {
    System.out.println("Account details for admin: XX");
  }
}

class GrantUserAccess extends GrantAccess {
  public static void displayAccountStatus() {
    System.out.println("Account details for user: XX");
  }
}

public class StatMethod {
  public static void choose(String username) {
    GrantAccess admin = new GrantAccess();
    GrantAccess user = new GrantUserAccess();
    if (username.equals("admin")) {
      admin.displayAccountStatus();
    } else {
      user.displayAccountStatus();
    }
  }

  public static void main(String[] args) {
    choose("user");
  }
}

...

In this compliant solution, the programmer declares the displayAccountStatus() methods as instance methods , by removing the static keyword. Consequently, the dynamic dispatch at the call sites produces the expected result. The @Override annotation indicates intentional overriding of the parent method.

Code Block
bgColor#ccccff

class GrantAccess {
  public void displayAccountStatus() {
    System.out.print("Account details for admin: XX");
  }
}

class GrantUserAccess extends GrantAccess {
  @Override
  public void displayAccountStatus() {
    System.out.print("Account details for user: XX");
  }
}

public class StatMethod {
  public static void choose(String username) {
    GrantAccess admin = new GrantAccess();
    GrantAccess user = new GrantUserAccess();

    if (username.equals("admin")) {
      admin.displayAccountStatus();
    } else {
      user.displayAccountStatus();
    }
  }

  public static void main(String[] args) {
    choose("user");
  }
}

...

The methods inherited from the superclass can also be overloaded in a subclass. Overloaded methods are new methods unique to the subclass and neither hide nor override the superclass method \ [[Tutorials 2008|AA. Bibliography#Tutorials 08]\].unmigrated-wiki-markupJava Tutorials].

Technically, a private method cannot be hidden or overridden. There is no requirement that private methods with the same signature in the subclass and the superclass bear any relationship in terms of having the same return type or {{throws}} clause, the necessary conditions for hiding \ [[JLS 2005|AA. Bibliography#JLS 05]\JLS 2015]. Consequently, hiding cannot occur when private methods have different return types or {{throws}} clauses.

Exceptions

MET07-J-EX0: Occasionally, an API provides hidden methods. Invoking those methods is not a violation of this rule , provided that all invocations of hidden methods use qualified names or method invocation expressions that explicitly indicate which specific method is invoked. If the displayAccountStatus() were a hidden method, for example, the following implementation of the choose() method would be an acceptable alternative:

Code Block
bgColor#ccccff

  public static void choose(String username) {
    if (username.equals("admin")) {
      GrantAccess.displayAccountStatus();
    } else {
      GrantUserAccess.displayAccountStatus();
    }
  }

...

Confusing overriding and hiding can produce unexpected results.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

MET07-J

low

Low

unlikely

Unlikely

medium

Medium

P2

L3

Automated Detection

Automated detection of violations of this rule is straightforward. Automated determination of cases where in which method hiding is unavoidable is infeasible. However, determining whether all invocations of hiding or hidden methods explicitly indicate which specific method is invoked is straightforward.

Bibliography

ToolVersionCheckerDescription
Parasoft Jtest
Include Page
Parasoft_V
Parasoft_V
CERT.MET07.AHSMDo not hide inherited "static" member methods

Bibliography

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="ff9cc536-abd7-4627-aca3-4e195ea34860"><ac:plain-text-body><![CDATA[

[[Bloch 2005

AA. Bibliography#Bloch 05]]

Puzzle 48. All I get is static

]]></ac:plain-text-body></ac:structured-macro>

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="eefc0dab-cd60-4ace-8d46-70f41ae062f3"><ac:plain-text-body><![CDATA[

[[JLS 2005

AA. Bibliography#JLS 05]]

[

[Bloch 2005]

Puzzle 48, "All I Get Is Static"

[Java Tutorials]

Overriding and Hiding Methods

[JLS 2015]

§8.4.8.2, "Hiding (by Class Methods)

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.8.2]

]]></ac:plain-text-body></ac:structured-macro>

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="eadcc744-0435-43bb-8c8a-b544d279dd8b

"

><ac:plain-text-body><![CDATA[

[[Tutorials 2008

AA. Bibliography#Tutorials 08]]

[Overriding and Hiding Methods

http://java.sun.com/docs/books/tutorial/java/IandI/override.html]

]]></ac:plain-text-body></ac:structured-macro>


...

Image Added Image Added Image AddedImage Removed      05. Methods (MET)      MET08-J. Ensure objects that are equated are equatable