Java中方法重载与方法重写
方法重载 overload
方法重载:在同一个类中,如果方法名相同,但是参数不同则为方法重载.
参数不同
- 参数类型不同
- 参数顺序不同
- 参数个数不同
public class Student {
protected String name = "Student";
public static void study(){
System.out.println("Student study day day up");
}
public static void study(){
System.out.println("Student study day day up");
}
public void read(Object bookName, Object... objects) {
System.out.println("read(Object bookName, Object... objects)");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < objects.length; i++) {
sb.append(objects[i].toString());
}
System.out.println("objects : " + sb.toString());
}
public void read(String bookName,Object time, Object... objects) {
System.out.println("read(String bookName,Object time, Object... objects)");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < objects.length; i++) {
sb.append(objects[i].toString());
sb.append(" ");
}
System.out.println("objects : " + sb.toString());
}
}
上面Student类中 两个 read() 就是一个重载.
但是这里有个坑,之前在写JVM中的方法调用时遇到.
怎么在第一个参数为 null 时调用read(Object bookName, Object… objects)
public static void main(String[] args) {
Student s = new Student();
s.read("123", "obj1","obj2");
s.read(null, "obj1","obj2");
s.read(null, new Object[]{1});
}
可以执行一下,具体的原因可以参考下面的链接
方法重写 override
重写只存在于 非静态非私有方法
在继承父类或实现接口时,对相同的方法名相同的参数类型的方法,进行重写
需要注意:静态方法没有重写.子类只是将父类的静态方法隐藏了.
public class MathStudent extends Student {
protected String name = "MathStudent";
public static void study(){
System.out.println("MathStudent study very well");
}
}
测试:
可以通过实例对象来调用静态方法.但是不推荐.这里只是为了说明
public static void main(String[] args) {
Student s = new Student();
MathStudent ms = new MathStudent();
s.study();
ms.study();
}
静态绑定与动态绑定
静态绑定:就是编译时就能够确定要调用的方法.
final static private 修饰的方法就是
动态绑定:编译时无法确定,只有运行时才能确定.
上述Student例子中,public static void study() {} 就是静态绑定.
static 修饰的方法,在类初始化后就确定了.它是根据类,而非对象.
所以编译器,可以直接调用.
但是
read() 却有不同的可能,只有执行时才能进行在方法表中寻找到对应的方法.
再进行连接
方法表: 在JVM进行动态绑定时,为了加快对要方法的配置.每个类都会将所有的
方法整理到一个表中方便检索. 子类与父类相同的方法在方法表中的索引相同
动态绑定有个坑,它只绑定方法,不绑定属性的
public static void main(String[] args) {
Student s = new Student();
MathStudent ms = new MathStudent();
s.printName();
ms.printName();
}
常见问题
父类的静态方法能否被子类重写,为什么?
JAVA的静态方法形式上可以重写,但是本质上不是Java的重写,所以答案是不能。
JVM中重载与重写
PS: 在JVM中不存在重载,只有重写.
因为JVM中是以 类名+方法名+方法描述符+返回类型 来判断的,所以JVM中不存在重载
但存在重写,这个不必多说.
有一点需要提一下,在Java中是重写,但在JVM中并不是.则会有桥接方法来实现