Java 方法覆盖和继承

Java method overriding and inheritance

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  void printMe() {
       System.out.println(getMe());
    }
}

class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

在这种情况下,"Son" 类型的引用 "son" 并且由于方法 printMe() 是非静态的,因此 class Son 中的方法代码将被执行。 但是由于Sonclass没有重新定义方法getMe(),所以会执行祖先class的方法代码。 所以我们得到 "dad".

第二种情况:

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  String getMe() {
        return me;
   }


class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

以类似的方式推理,在这种情况下,儿子 class 没有重新定义方法 printMe(),因此应该执行 class 父亲的方法 printMe() 的代码。 但是我们得到 "Son"。为什么?

然后继承呢?即如果继承人不重写祖先方法,那么他们一起共享祖先方法的代码?

在第一种情况下,son.printMe() 调用 SonprintMe()(因为 Son 覆盖了该方法),后者调用 DadgetMe()(因为 Son 没有覆盖该方法),其中 returns "dad".

在第二种情况下 son.printMe() 调用 DadprintMe()(因为 Son 没有覆盖该方法),它调用 Son' s getMe(),因为 Son 覆盖了那个方法。因此 "son" 被打印出来。

在第二种情况下,您调用 Dad#printMe,后者又调用 getMe。由于 Son 确实覆盖了它,因此调用了 Son#getMe。该方法 returns "Son",然后由 printMe.

打印

您正在使用 tge diff class 覆盖相同的方法,但参数相同,因为 tge main 方法正在调用子方法

案例二: son.printMe() 将调用 Dad class printMe(),因为在 Son class 中并非没有。现在它将在层次结构中最近的实现 class 中寻找 getMe(),即 Son class。现在 Son#getMe() 将在此实现 class 中查找变量 me,并找到值 "son",因此正在打印。请记住,private static final String me = "dad";private static final String me = "son"; 是属于两个不同 class 的两个不同的私有变量。如果 Son class 中没有定义 me 变量,你就会得到一个编译错误。