java语言的方法签名和jvm的方法签名是不一样的,java的方法签名是方法名+参数列表(参数类型+参数个数+参数顺序)
重写(override):就是要求子类的方法签名和父类的一致,可以改方法的访问权限,但是要求子类的方法权限要大于父类的;并且当方法返回值是引用类型时可以修改返回值类型,但要求子类的方法返回值类型必须是父类方法返回值类型的子类。
重载(overload):方法名相同,方法签名不同
抽象方法:用abstract修饰,没有方法体,由实现类来实现,注意接口的方法,因为java8接口可以有static和default方法这些方法不是抽象的,其它的都算抽象方法,只是默认少了public abstract而已,你想加上也可以
静态方法:static 修饰的方法,通过类名直接调用(⚠️用变量调用static方法编译不通过)
实例方法:实例方法必须在对象实例化之后,通过对象引用来调用,接口的default方法也是实例方法,因为它也是可以override和继承的并且要通过接口的实现类对象来调用(这里的意思是说:a.hello(),就算a变量的类型不是一个实现类类型而是接口,但是a变量应用指向的是实现类对象)
虚方法:可以override的方法都可以称作虚方法,因此虚方法并不需要做特殊的声明,也可以理解为除了用static、final、private修饰之外的所有方法都是虚方法。
在一些介绍jvm的书是这样区分非虚方法和虚方法:首先要知道jvm的五个方法调用指令:
invokestatic:用于调用静态方法(包括接口的static)。
invokespecial:用于调用实例构造器<init>()方法、私有方法()和父类中的方法(单指使用super关键字调用父类的实例方法或构造器)。
invokevirtual:调用虚方法即非私有的实例方法(final方法也是用这个指令,但是final是虚方法)
invokeinterface:用于调用接口方法(包括default方法),会在运行时再确定一个实现该接口的对象。