为什么我不能降低继承的静态方法的可见性

时间:2016-02-01 16:56:38

标签: java inheritance override static-methods

不允许覆盖和降低继承方法的可见性,但关键是你不能覆盖静态方法:

  

如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法隐藏超类中的方法。

那么为什么第二个隐藏确定而第一个隐藏没有?

public class Base {

  public static void foo(){
      System.out.println("Base");
  }
}

hide1:

public class Sub extends Base {

  static void foo(){          //cannot reduce visibility error!
      System.out.println("Sub");
  }
}

hide2:

public class Sub extends Base {
  public static void foo(){   //OK
      System.out.println("Sub");
  }
}

2 个答案:

答案 0 :(得分:1)

原因是,您可能希望将子类的实例作为消费者的超类类型。这个消费者试图运行他用来运行的(公共)方法,因为它是公开的,但是你把它隐藏起来并保护它。为了防止这种情况,引入了此规则。 (问题是可见性,而不是静态!)。 虽然我不得不承认,这种推理并不完全适用于静态方法,只是当消费者希望直接拥有子类(作为子类)时,就像他用来运行超类一样。

答案 1 :(得分:1)

可以隐藏子类中的static超类方法:

public class Base {
    public static void foo(){
        System.out.println("Base");
    }
}

public class Sub extends Base {
    static void foo(){          //cannot reduce visibility error!
        System.out.println("Sub");
    }
}

public class Sub1 extends Base {
    public static void foo(){   //OK
        System.out.println("Sub1");
    }
}
public class Main {
    public static void main(String[] args)
    {
        Base.foo();
        Sub1.foo();
    }
}

输出:

  

     

Sub1的

Sub您尝试降低可见性(从public转到no modifier)。在Sub1中,您不是降低可见性(从publicpublic)。这就是为什么它在Sub1而不是Sub进行编译的原因。这是关于方法的可见性。它与覆盖/隐藏无关。 (隐藏在这种情况下,因为它是static方法)。

如果您尝试在Sub.foo()方法中运行main而不更改任何内容,则会出现此异常:

  

线程中的异常" main" java.lang.Error:未解决的编译问题:       无法从Base

降低继承方法的可见性

Here是一个类似的问题和答案。