重载(Overload):
指一个类中可以有多个方法具有相同的名字,但这些方法的参数不同(参数的类型和个数不同)。
下面Test类中,func方法的参数列表不同,就构成重载
重载规则:
1、同一个类
2、方法名相同
3、参数列表不同(包括:类型、个数)
重写(override)
像上面这样父类与子类中的两个方法
1、必须在继承关系中
2、方法名相同
3、参数列表相同
此时两个方法构成了重写,也叫做覆写、覆盖等。
方法重写的规则:
- 子类在重写父类的方法时,必须与父类的返回值类型、方法名、参数列表要完全一致
- 返回值(JDK7以后,被重写的方法返回值类型可以不同,但是必须是具有父子关系的)
- 访问权限不能比父类中被重写的方法的访问权限更低,如:父类方法被public修饰,则子类中重写该方法就不能声明为protected
- 父类中被static、private修饰的方法、构造方法都不能被重写
- 重写的方法可以使用 @Override 注解来显式指定,该注解可以帮我们进行一些合法性校验,如不小心将方法名拼写错了(比如eat写成aet),此时编译器会发现父类中没有aet方法,就会编译报错,提示无法构成重写
重写与重载的区别:
即:方法重载时一个类的多态性表现,而方法重写时子类与父类的一种多态性表现
重写的设计原则
对于已经投入使用的类,尽量不要进行修改,最好的方式是重新定义一个新的类,来重复利用其中共性的内容,并且添加或改动新的内容。
idea重写快捷键
静态绑定:
也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法,如:函数重载
如下代码:
当传递实参类型为一个int,一个double时,只能调用 func(int x,double y){ }
动态绑定:
也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法
如下代码:
通过字节码查看,程序在编译的时候确实调用的是父类的eat方法,当运行代码时,通过父类引用,实际调用了子类重写的方法,此时这种情况就叫做动态绑定
演示所用代码:
//此为Test类
public class Test{
public static Animal func(){
Cat cat = new Cat();
return cat;
}
public static void main(String[] args){
Animal animal = func();
}
}
public class Test{
public static void main(String[] args) {
Animal animal = new Cat();
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.bark();
}else{
System.out.println("向下转型失败!");
}
}
}
public class Test{
public void func(int x){
}
public void func(int x,int y){
}
public static void main(String[] args) {
Animal animal = new Cat("喵喵");
animal.eat();
}
}
public class Test{
public static void func(int x){
}
public static void func(double x){
}
public static void func(int x,double y){
}
public static void func(double y,int x){
}
public static void main(String[] args) {
func(100,3.14);
}
}
//此为Animal类
public class Animal {
String name;
private int age;
public Animal(String name) {
this.name = name;
}
public void eat(){
System.out.println(name + " 正在吃饭!");
}
}
//此为Dog类
public class Dog extends Animal{
public Dog(String name) {
super(name);
}
public void eat(){
System.out.println(name + " 正在吃骨头!");
}
public void bark(){
System.out.println(name + " 正在汪汪叫!");
}
}
//此为Cat类
public class Cat extends Animal{
public Cat(String name) {
super(name);
}
@Override
public void eat(){
System.out.println(name + " 正在吃鱼!");
}
}