是否可以从子静态方法调用超静态方法?
我的意思是,以通用的方式,到目前为止,我有以下内容:
public class BaseController extends Controller {
static void init() {
//init stuff
}
}
public class ChildController extends BaseController {
static void init() {
BaseController.loadState();
// more init stuff
}
}
Run Code Online (Sandbox Code Playgroud)
并且它有效,但我想以通用方式执行它,比如调用super.loadState(),这似乎不起作用......
最近我使用一些简单的Java代码来使用main快速测试我编写的代码的方法.我最终遇到了两个类似的类:
public class A {
public static void main(String[] args) {
// code here
}
}
public class B extends A {
public static void main(String[] args) throws IOException {
// code here
}
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶代码停止编译,Eclipse抱怨说Exception IOException is not compatible with throws clause in A.main(String[]).
好吧,这两个方法都是静态的,而main函数B只是隐藏了一个A,所以我认为它们之间完全没有关系.在静态方法我们没有多态性与呼叫被绑定到编译过程中的具体方法的实现,因此我不明白,为什么main在B不能乱扔未在声明例外main的签名A.
为什么Java设计者决定强制执行这样的约束,如果编译器没有强制执行约束,它会在什么情况下导致问题呢?
由于in 的String返回类型,此代码将无法编译.staticMethodChild
class Parent {
static void staticMethod() {
}
}
class Child extends Parent {
static String staticMethod() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道§8.4.8.3中的JLS 8,"覆盖和隐藏的要求"说:
如果具有返回类型R1的方法声明d1覆盖或隐藏具有返回类型R2的另一个方法d2的声明,则对于d2,d1必须是return-type-substitutable(第8.4.5节),否则会发生编译时错误.
我的问题是在静态方法的特定情况下进行编译时检查的动机是什么,这个例子说明在编译期间未能进行此验证会产生任何问题是理想的.
我读到了这样做:
public final void foo() {}
Run Code Online (Sandbox Code Playgroud)
等于:
private static void foo() {}
Run Code Online (Sandbox Code Playgroud)
两者都意味着该方法不可覆盖!
但是,如果一个方法是私有的,我自动无法访问,我看不到等价...
public interface Expression {
}
public interface ArithmeticExpression extends Expression {
}
public class StaticMethodDemo {
public static void print(Expression e) {
System.out.println("StaticMethodDemo");
}
public static List<Expression> convert(
Collection<? extends Expression> input) {
return null;
}
}
public class StaticMethodChild extends StaticMethodDemo {
public static void print(ArithmeticExpression e) {
System.out.println("StaticMethodChild");
}
public static List<ArithmeticExpression> convert(
Collection<? extends ArithmeticExpression> input) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在java 5中编译但在java 7中没有编译为什么?在java 7中,它给出了"Name clash:StaticMethodChild类型的方法convert(Collection)与StaticMethodDemo类型的convert(Collection)具有相同的擦除,但不隐藏它"
可能重复:
为什么Java不允许覆盖静态方法?
有没有合理的理由为什么人们希望派生类重写隐藏static基类的方法?
我找不到任何好的来源来解释原因:
abstract class AA {
public static void log() {}
}
class BB extends AA {
public void log() {} //error
}
Run Code Online (Sandbox Code Playgroud)
interface CC {
public static void log() {}
}
class DD implements CC {
public void log() {} //Ok
}
Run Code Online (Sandbox Code Playgroud)