我们知道,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方法");
	}
	
}
}

运行结果如下:

java中父类和子类同名的成员变量如何调用_多态

为什么会产生不同的情况呢?

结合代码谈谈个人理解:多态是一种运行时行为,static修饰的结构是随着类的加载而加载的,且他们的加载顺序就是按照我们写代码的顺序。所以,当我们在调用show方法时,编译器会通过方法名去找我们写的方法,而父类的show方法一定是先被加载的,所以虽然在使用多态之后会有一个子类同名的show方法存在,但是因为我们写代码的顺序,所以编译器会先找到父类的show方法,既然找到了要的方法,那么就不再继续扫描了。

以上这一段的内容不一定对,纯我个人理解,可以讨论一下。