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()是非静态的,因此将执行来自类Son的方法的代码。 但是,由于Son类尚未重新定义方法getMe(),因此将执行祖先类中的方法代码。 所以我们得到“爸爸”。
第二种情况:
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();
}
}
在那种情况下,Son类没有重新定义方法printMe()的原因,因此应该执行类Dad中方法printMe()的代码。 但是我们得到“儿子”。为什么?
那继承呢?也就是说,如果继承人没有覆盖祖先的方法,那么他们一起共享祖先的方法的代码吗?
答案 0 :(得分:4)
在第一种情况下,son.printMe()
调用Son
的{{1}}(因为printMe()
覆盖了该方法),后者调用了Son
的{{1} }(因为Dad
没有覆盖该方法),它返回“ dad”。
在第二种情况下,getMe()
调用Son
的{{1}}(因为son.printMe()
没有覆盖该方法),后者调用Dad
的{ {1}},因为printMe()
会覆盖该方法。因此,将打印“儿子”。
答案 1 :(得分:1)
在第二种情况下,您正在呼叫kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(2*h+1,1))
closed_img = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
,而后者依次呼叫href
。由于mailto:
会覆盖它,因此会调用<span>
。该方法返回“ Son”,然后由<a href="mailto:person@example.com"><span>link text</span></a>
打印。
答案 2 :(得分:0)
您正在使用tge diff类覆盖相同的方法,但是该tge main方法调用son方法的参数相同。
答案 3 :(得分:0)
情况2:
son.printMe()
会调用Dad
类的printMe()
类,而不是Son
类中没有被划分的类。现在它将在层次结构中最接近的实现类(即getMe()
类)中寻找Son
。现在Son#getMe()
将在此实现类中查找变量me
,并找到值"son"
,因此将其打印出来。请记住,private static final String me = "dad";
和private static final String me = "son";
是属于两个不同类的两个不同的私有变量。如果me
类中没有Son
变量的定义,则会产生编译错误。