天天看点

Overriding and Hiding Methods

Instance Methods

An instance method in a subclass with the same signature (name, plus the number and the type of its parameters) and return type as an instance method in the superclass overrides the superclass's method.

The ability of a subclass to override a method allows a class to inherit from a superclass whose behavior is "close enough" and then to modify behavior as needed. The overriding method has the same name, number and type of parameters, and return type as the method it overrides. An overriding method can also return a subtype of the type returned by the overridden method. This is called a covariant return type.

When overriding a method, you might want to use the 

@Override

 annotation that instructs the compiler that you intend to override a method in the superclass. If, for some reason, the compiler detects that the method does not exist in one of the superclasses, it will generate an error. For more information on 

@Override

, see 

Annotations

.

Class Methods

If a subclass defines a class method with the same signature as a class method in the superclass, the method in the subclass hides the one in the superclass.

The distinction between hiding and overriding has important implications. The version of the overridden method that gets invoked is the one in the subclass. The version of the hidden method that gets invoked depends on whether it is invoked from the superclass or the subclass. Let's look at an example that contains two classes. The first is 

Animal

, which contains one instance method and one class method: class Animal

{

     public static void testClassMethod(){

          System.out.println("The class method in Animal");

     }

     public void testInstanceMethod()

     {

          System.out.println("The instance in Animal");

     }

}

class Cat extends Animal

{

     public static void testClassMethod(){

          System.out.println("The class method in Cat");

     }

     public void testInstanceMethod(){

          System.out.println("The instance in Cat");

     }

}

public class staticoverride

{

     public static void main(String[] args){

          Cat myCat = new Cat();

          Animal myAnimal = myCat;

          Animal.testClassMethod();

          myAnimal.testClassMethod();

          myAnimal.testInstanceMethod();

     }

} 结果为: The class method in Animal

The class method in Animal

The instance in Cat