违反 Java 解释器和编译器规则



我有一个"理论"问题,但这是为了理解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
}

注意:我知道语法错误是什么以及如何修复它们。

我的问题是:

  1. 如果我们"忽略"(理论上)编译器错误,在运行时会发生什么?此语法错误意味着避免什么?
  2. 为什么违反规则会导致运行时错误?
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和你认为"几乎是程序,但语法错误很少"的东西。

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() 方法呢?

如果您理解第一个问题的答案,则可以单独回答第二个问题;)

最新更新