Java中方法重载与方法重写

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});
	}

可以执行一下,具体的原因可以参考下面的链接

JVM 方法调用

方法重写 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();
}

result1

静态绑定与动态绑定

静态绑定:就是编译时就能够确定要调用的方法.
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();
}

result2

参考连接

常见问题

父类的静态方法能否被子类重写,为什么?

JAVA的静态方法形式上可以重写,但是本质上不是Java的重写,所以答案是不能。

参考文章

JVM中重载与重写

PS: 在JVM中不存在重载,只有重写.

因为JVM中是以 类名+方法名+方法描述符+返回类型 来判断的,所以JVM中不存在重载

但存在重写,这个不必多说.

有一点需要提一下,在Java中是重写,但在JVM中并不是.则会有桥接方法来实现

桥接方法

JVM 方法调用

发布了92 篇原创文章 · 获赞 18 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_34120430/article/details/87537258