最近,我正在使用一些简单的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
}
}
我对代码停止编译感到惊讶,而Eclipse对此表示抱怨Exception IOException is not compatible with throws clause in A.main(String[])
。
好吧,这两种方法都是静态的,并且其中的main
函数B
只是对中的一种隐藏A
,因此我认为它们之间完全没有关系。在静态方法中,我们没有多态性,并且该调用在编译期间绑定到具体的方法实现,因此,我无法理解为什么main
in
B
不能抛出在main
签名中未声明的异常A
。
为什么Java设计人员决定强制执行这样的约束,如果编译器未强制执行约束,在什么情况下会导致问题?
值得一提的是,这是JLS实施此规则的相关部分。
首先,第8.4.8.2节。隐藏(按类方法)提供了一种方法隐藏的定义,该定义适用于此处:
如果C类声明或继承了一个
static
方法m
,则m
可以说它 隐藏了
任何方法m'
,其中C的签名m
是C的签名的子签名(第8.4.2节),m'
否则C的超类和超接口可以通过代码访问。在C.
然后,第8.4.8.3节。覆盖和隐藏要求中指出:
覆盖或隐藏另一个方法(包括实现
abstract
接口中定义的方法的方法)的方法可能不会声明比覆盖或隐藏的方法抛出更多的检查异常。更准确地说,假设B是类或接口,而A是B的超类或超接口,并且B中的方法声明
m2
覆盖或隐藏m1
A中的方法声明。然后:
- 如果
m2
有一个throws
提及任何检查的异常类型m1
的throws
子句,则必须有一个子句,否则会发生编译时错误。* 对于的
throws
子句中列出的每个检查的异常类型m2
,必须在的throws
子句的擦除(第4.6节)中出现相同的异常类或其超类型之一m1
。否则,将发生编译时错误。
换句话说,错误消息不是编译器的疏忽,也不是对规范的误解。JLS专门指出,throws
子句冲突 是
方法隐藏(即静态方法)的错误。在回版本为1.0的每个JLS版本中都有与此等效的语言。
但是,对于这种情况下 为什么
存在约束,我无法确切回答您的问题。我无法想到任何需要约束的情况,因为与实例方法不同,调用静态方法实现的问题始终在编译时得到完全解决。
我敢打赌,谁先把这个限制放在langspec中,谁就太过谨慎了,他认为防止某事比允许某事更安全,然后发现它会引起问题,这是一笔小小的钱。Java语言设计并非没有缺陷功能(检查异常是其中之一),并且可以肯定地说这是另一种缺陷功能,但这只是一个猜测。
当我试着运行这段代码时,它给了我30。有人能解释一下吗!我知道在Java中不能重写静态方法,因为多态性和静态方法不能一起工作。静态方法在类上调用,而不是在实例中调用。但有人能就这个话题做进一步解释吗。我真的不明白为什么我的分数是30而不是10。谢谢
此代码将无法编译,因为中的的返回类型。 我知道§8.4.8.3“覆盖和隐藏要求”中的JLS 8规定: 如果具有返回类型R1的方法声明d1重写或隐藏了具有返回类型R2的另一个方法d2的声明,则d1必须是d2的返回类型可替换的(§8.4.5),否则会发生编译时错误。 我的问题是,在静态方法的特定情况下,这种编译时检查的动机是什么,一个例子说明了在编译期间不进行这种验证会产生任何问题是理想的。
我正在读一本java的书,在那里我偶然发现了这样一句话: 我真的很困惑为什么它说 我想要一些解释。
Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。
问题内容: 我知道不可能在一个类中重写一个方法。但是,有没有办法使用非静态方法作为静态方法呢?例如,我有一个加数字的方法。我希望此方法在没有对象的情况下有用。是否可以在不创建其他方法的情况下执行类似的操作? 编辑:我的意思是,如果我将一个方法设为静态,我将需要它接受参数,如果我创建了一个已经设置了变量的对象,那么再次对具有相同参数的对象调用函数将非常不舒服。 我知道代码不正确,但是我想展示自己想做
为什么不可能在子类中有一个静态方法,它的签名与父类中的签名相同? 我只是想知道为什么他们允许在这里使用final修饰符?我们都知道静态方法属于一个类而不属于对象,所以不可能在子类中重写方法。所以对于我来说在这里是多余的。