java解释器和编译器规则违规

时间:2015-04-12 14:01:38

标签: java compilation compiler-errors syntax-error

我有一个“理论”问题,但这是为了理解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. 为什么违反规则会导致运行时错误?

2 个答案:

答案 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()方法,如果它们都具有相同的名称呢?

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