我们知道,static关键字是可以修饰方法的,那么当我在子父类中定义了同名同参的方法时,再用子、父类的对象调用该方法,调用的到底是子类方法还是父类方法?
先说结论:
当子父类定义了同名的静态方法,
1.用谁的对象调用那么执行的就是谁的方法
2.用哪个类调用就是哪个方法
3.多态实现时调用的是父类的方法
如果回忆一下继承多态的知识,子类将会继承父类的所有属性方法,如果在子类中重新声明和父类中的同名方法,那么我们就称其为重写。
我们都知道,如果子类重写了父类的方法,那么当我们用父类引用指向子类的对象时,父类的对象调用的是子类重写后的方法。可是,当你用static修饰了该同名方法之后,你再用父类对象调用时却使用的是父类的方法,而非重写后的。
直接上代码
package com.crz.java;
public class StaticExtends {
public static void main(String[] args) {
Person person = new Person();
Man man = new Man();
Person personMan = new Man();
person.output(); //用父类对象调用非静态的方法output()
man.output(); //用子类对象调用非静态的方法output()
personMan.output();//用多态对象调用非静态的方法output()
System.out.println("*************");
person.show(); //用父类对象调用静态的方法show()
man.show(); //用子类对象调用静态的方法show()
personMan.show();//用多态对象调用静态的方法show()
System.out.println("*************");
Person.show(); //父类通过类名直接调用方法show()
Man.show(); //子类通过类名直接调用方法show()
}
static class Person{//父类Person
public void output(){
System.out.println("我是父类的output方法");
}
public static void show(){
System.out.println("我是父类的show方法");
}
}
static class Man extends Person{//子类Man
public void output(){
System.out.println("我是子类的output方法");
}
public static void show(){
System.out.println("我是子类的show方法");
}
}
}
运行结果如下:
为什么会产生不同的情况呢?
结合代码谈谈个人理解:多态是一种运行时行为,static修饰的结构是随着类的加载而加载的,且他们的加载顺序就是按照我们写代码的顺序。所以,当我们在调用show方法时,编译器会通过方法名去找我们写的方法,而父类的show方法一定是先被加载的,所以虽然在使用多态之后会有一个子类同名的show方法存在,但是因为我们写代码的顺序,所以编译器会先找到父类的show方法,既然找到了要的方法,那么就不再继续扫描了。
以上这一段的内容不一定对,纯我个人理解,可以讨论一下。