我有一个“理论”问题,但这是为了理解java
编译规则背后的内容(或者可能是解释器)。
假设我们有以下代码:
class A {}
class B extends A {}
class X {
public B getValue(){return null;}
}
class Y extends X {
public A getValue(){return null;} //compilation error here
}
class Z {
public List<A> getAList(List<B> x) {return x;} //compilation error here
}
注意:我知道有哪些语法错误以及如何修复它们。
我的问题是:
答案 0 :(得分:0)
What could have happen in runtime if we would "ignore" (in theory) the compiler errors?
编译器将Java代码转换为字节代码,这只是一组指令。要做到这一点,它确实需要非常具体的规则来知道该做什么 - 比如关键词,括号 - 语法。
如果语法错误,它不知道如何处理它,因此无法对其进行转换。
对于编译器,尝试制作随机字符序列的程序之间没有太大的区别:oawpgapwo nap gunapoigu awpougn awpougn apowrgn pagn pawog poawng panbx
以及你认为“几乎是程序,但语法错误很少”的东西。
答案 1 :(得分:0)
class Y extends X {
@Override //class Y extends class X which has a public method B getValue()
public B getValue() {
return super.getValue();
}
private A getValue() {return null}
X有一个名为getValue()的方法 Y扩展X,因此Y与他的超类具有相同的方法getValue()。 那么编译器如何知道你想要使用哪个getValue()方法,如果它们都具有相同的名称呢?
如果您理解第一个问题的答案,您可以单独回答第二个问题;)