Java中的静态方法重载和覆盖

时间:2020-01-09 10:34:50  来源:igfitidea点击:

当使用Java中的static关键字定义类成员时,它与该类而不是与该类的实例相关联。这引发了一个问题,我们可以重载或者覆盖Java中的静态方法。这篇文章试图回答这个问题。

在此之前,让我们快速回顾一下Java中的方法重载和方法覆盖

方法重载-在Java中,只要它们的参数类型或者数字不同,就可以在同一个类中使用两个或者多个具有相同名称的方法。这些类型的方法称为重载方法,该过程在Java中称为方法重载。

方法覆盖-如果子类中的方法与父类中的方法具有相同的名称和签名(参数的数量和类型),则子类将覆盖父类中的方法,并且此过程称为Java中重写方法。

Java中的静态方法重载和重写

现在的问题是,在静态上下文中会发生什么。我们可以在Java中重载静态方法还是覆盖静态方法?

Java中的静态方法重载

就像非静态方法一样,也可以重载静态方法。我们可以使用名称相同但参数类型或者数字不同的两个或者多个静态方法。

Java静态方法重载示例

在该示例中,有一个重载的静态方法displayValue(),其中一个方法是使用单个int参数定义的,另一个方法采用了两个int参数,而另一个方法则采用了一个int和一个String参数。

public class StaticOverload {
	
	public static void displayValue(int i){
		System.out.println("Value is- " + i);
	}
	public static void displayValue(int i, int j){
		System.out.println("Values are- " + i + " " + j);
	}
	public static void displayValue(int i, String s){
		System.out.println("Values are- " + i + " " + s);
	}
	public static void main(String[] args) {
		//displayValue(int i)
		StaticOverload.displayValue(5);
		//displayValue(int i, int j)
		StaticOverload.displayValue(5, 7);
		//displayValue(int i, String s)
		StaticOverload.displayValue(5, "Hello");
	}
}

输出:

Value is- 5
Values are- 5 7
Values are- 5 Hello

Java中静态方法重载的规则

  • 如果静态方法仅在返回类型上有所不同,则不将其视为重载方法。
  • 如果实例方法和静态方法具有相同的名称,则不会将其视为重载,实际上会导致编译时错误。考虑以下代码,其中一种方法是静态的。这段代码给出了编译时错误"类型重复的方法displayValue(int)"
public void displayValue(int i){
	System.out.println("Value is- " + i);
}
public static void displayValue(int i){
	System.out.println("Values are- " + i);
}

Java中的静态方法覆盖

静态方法无法覆盖。如果子类中有一个与父类中签名相同的静态方法,则它只会隐藏父类方法。不会有任何运行时多态性,即我们将无法使用父类引用来调用子类覆盖的静态方法,因为静态方法是在编译时本身绑定的,它们在运行时不会解析。

class Parent{
	//static method
	public static void cantOverride(){
		System.out.println("This static method can not be overridden");
	}
	// non-static method
	public void canOverride(){
		System.out.println("This method can be overridden");
	}
}

class Child extends Parent{
	//static method
	public static void cantOverride(){
		System.out.println("Static method in child class");
	}
	// non-static method
	public void canOverride(){
		System.out.println("This method is overridden in child class");
	}
}

public class StaticOverride {
	public static void main(String[] args) {
		Parent obj = new Child();
		obj.cantOverride();
		obj.canOverride();

	}
}

输出:

This static method can not be overridden
This method is overridden in child class

如我们所见,即使父类引用在调用重写的静态方法时保留了子类对象,也将调用父类的方法,其中调用非静态方法的子类方法。