方法重载和方法重写

方法重载:(Overload)

方法重载发生在类中的几个方法上,每个重载方法的参数类型参数的数量必须是不同的。虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分使用的是哪个方法。demo:

public void show(int i){...}

public int  show(int i,String s){return...}

方法重写:(Override)

方法重写发生在类的继承中,子类覆盖父类的方法,但是要遵循以下规定:

(1)子类方法的名称、参数名和返回类型必须与父类方法的名称、参数名和返回类型一致。

(2)子类方法不能缩小父类的访问权限(即父类方法是public,子类重写方法不能小于public的权限)

为什么不能小于呢??

父类方法为public,子类方法为private,那么:

Fu f=new ZI();

f.方法。多态中,实际上对象f调用的是ZI类中的方法,那么问题来了,你子类的方法是private,怎么调用??编译的时候不会报错,但运行时会报错。

(3)子类方法抛出的异常必须和父类方法抛出的异常相同,或者是父类方法抛出异常的子类。为什么呢??

假设你抛出的是其他异常,同样会和多态冲突:

Fu:方法  Exception1{...}

Zi: 方法  Exception2{...}

Test(测试):

Fu f=new Zi();

try{

f.方法;

}catch(Exception1 e){...}存在的问题就捕获不到异常。

(4)方法覆盖只能存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。

(5)父类的静态方法不能被子类覆盖为非静态方法。

(6)子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。

子类隐藏父类的静态方法和子类覆盖父类的实例方法,这两者的区别在于:运行时,Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。

class Fu {
	public void method() {
		System.out.println("method of Fu");
	}

	public static void staticMethod() {
		System.out.println("static of Fu");
	}
}

class Zi extends Fu {
	public void method() {
		System.out.println("method of Zi");
	}

	public static void staticMethod() {
		System.out.println("static of Zi");
	}
}

public class Book_09 {

	public static void main(String[] args) {
		Fu z = new Zi();
		z.method();
		z.staticMethod();
		Zi z2 = new Zi();
		z2.method();
		z2.staticMethod();
	}
}
//运行结果:
method of Zi
static of Fu
method of Zi
static of Zi

实际上JDK也不建议通过实例对象调用静态方法(会给出警告,说建议使用类名调用),但是原理也依旧是要懂的,就是静态方法和类绑定,实例方法和实例绑定。同理变量(无论是静态还是非静态)的覆盖也是和类绑定的。子类中若想使用父类的变量,即可这样写super.变量名。静态方法中不可以使用super。

(7)父类的费静态方法不能被子类覆盖为静态方法。

(8)父类的私有方法不能被子类覆盖。

(9)父类的抽象方法可以被子类通过哪两种途径覆盖:一种是子类实现父类的抽象方法;另外一种是子类重新声明父类的抽象方法。

(10)父类的非抽象方法可以被覆盖为抽象方法。

class Fu{
    public void show(){...}
}
calss Zi extends Fu{
    public abstract void show();
}

注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。

猜你喜欢

转载自blog.csdn.net/m0_37265215/article/details/82146288