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()
调用 Son
的 printMe()
(因为 Son
覆盖了该方法),后者调用 Dad
的 getMe()
(因为 Son
没有覆盖该方法),其中 returns "dad".
在第二种情况下 son.printMe()
调用 Dad
的 printMe()
(因为 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
变量,你就会得到一个编译错误。
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()
调用 Son
的 printMe()
(因为 Son
覆盖了该方法),后者调用 Dad
的 getMe()
(因为 Son
没有覆盖该方法),其中 returns "dad".
在第二种情况下 son.printMe()
调用 Dad
的 printMe()
(因为 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
变量,你就会得到一个编译错误。