java解释器和编译器规则冲突

java解释器和编译器规则冲突,java,compilation,compiler-errors,syntax-error,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 Lis

我有一个“理论”问题,但这是为了理解
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
}
class A{}
类B扩展了{}
X类{
公共B getValue(){return null;}
}
类Y扩展X{
public A getValue(){return null;}//此处存在编译错误
}
Z类{
public List getAList(List x){return x;}//此处编译错误
}
注意:我知道哪些语法错误以及如何修复它们

我的问题是:

  • 如果我们“忽略”(理论上是)编译器错误,在运行时会发生什么?这个语法错误是为了避免什么
  • 为什么违反规则会导致运行时错误
  • 编译器将Java代码转换为字节码,字节码只是一组指令。要做到这一点,它确实需要非常具体的规则来知道该做什么——比如关键字、括号——语法

    如果语法错误,它不知道如何处理它,因此无法转换它

    编译器对随机char序列的编程尝试没有太大的区别:<代码> OAWPGAPWO NAP-GAPAPOGIU AWPUGNN AWOWGGN PAPN PAWOG POWAXPANX和一些你认为“几乎程序,但语法错误很少”的东西。 X有一个名为getValue()的方法 Y扩展了X,因此Y具有来自其超类的相同方法getValue()。 那么,如果两个getValue()方法的名称相同,编译器如何知道要使用哪一个呢


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

    我想是不明确的行为。所有的事情都不能再正常工作了(多态性、虚拟方法调度等),这就是为什么要确定一组规则,让代码遵循这些规则(JLS)。没有人会费心去找出“忽略”这些编译错误所导致的确切问题,因为这完全是理论上的。因此:未定义。@Jeroenvanevel-“未定义的行为”不是我想要的答案。我编辑这个问题是为了让它更清楚。它可能不是你想要的,但我怀疑你会得到任何其他东西。你所问的行为实际上没有定义,所以你只能猜测这个假设情景。也许执行了错误的方法?也许运行时开始抛出错误?谁知道呢。@Jeroenvanevel-我相信这与内存、解释、java语法/方法评估、操作系统寄存器等有关。对此有一个恰当的解释。我只是(还)找不到它@ZivLevy我有几个问题要问你。你知道动态方法调度是什么吗?你知道协方差是什么回报类型吗?您认为这些功能在不设置您幻想中要删除的编译限制的情况下是可能的吗?如果我最后一个问题的答案是否定的,那么你有你的答案。
    What could have happen in runtime if we would "ignore" (in theory) the compiler errors?
    
    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}