我们通过下面代码来测试:
class Parent{
static void a(){
System.out.println("Parent");
}
}
class Children extends Parent{
static void a(){
System.out.println("Children");
}
}
class Main {
public static void main(String[] args) {
Parent parent = new Parent();// (1)
Parent children = new Children(); //(2)
Children children1 = new Children(); //(3)
parent.a();
children.a();
children1.a();
}
}
测试结果
Parent
Parent
Children
代码(1),(3)测试如常,很容易理解,看似并没有什么不同
而代码(2)显示的结果却是Parent。
按照常理来说应该是Children,为什么会是Parent?
这是因为用static修饰的方法不能被重写,代码(3)测试结果之所以会是Children是因为它相当于自己定义了一个a()函数,注意这个函数并不是Parent里的a()函数,(就像 现实中两个名字相同的学生一样,他们只是名字相同并非同一个人),这就解释了为什么代码三会的到Children而红色代码二会得到Parent。