(个人理解,仅供参考)
基础知识
Java中存在两种多态,即重载(Overload)和重写(Override),重写是和继承有关的多态。
方法重载
方法重载的意思是,一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型,甚至包括参数的顺序不同。例如:在下面的Animal类中,eat方法就是一个重载方法。
class Animal {
public void eat() { //无参的实例方法
System.out.println("Animal eat");
}
public void eat(int n) { //参数为int型的有参实例方法
System.out.println("eat:"+n);
}
public void eat(String m) { //参数为Str型的有参实例方法
System.out.println("eat:"+m);
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Animal(); //创建一个Animal类的实例对象a
a.eat(); //调用无参的eat方法
a.eat(123); //调用int型参数的eat方法
a.eat("apple"); //调用Str型参数的eat方法
}
}
方法重写
子类通过重写可以隐藏已经继承的实例方法(方法重写也成为方法覆盖)
重写的语法规则
如果子类可以继承父类的某个实例方法,那么子类就有权重写这个方法。重写就是指在子类中定义一个方法,这个方法的类型和父类方法的类型一致,或者是父类的方法的类型的子类型(所谓子类型,是指如果父类的方法的类型是“类”,那么允许子类的重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。子类如此定义的方法称为子类重写的方法(不属于新增的方法)。
重写的目的
子类通过方法的重写可以隐藏继承的方法,可以把父类的状态和行为改变为自身的状态和行为。当子类重写了父类的方法A后,子类对象调用方法A时调用的就是重写后的方法A,而不是其父类的方法A。重写方法既可以操作子类继承的成员变量,也可以操作子类新声明的成员变量。(另外,如果子类想使用被隐藏的方法,必须使用关键字super。)
例如:Dog类继承Animal类,并且重写了eat方法。
class Animal {
public void eat() { //无参的实例方法
System.out.println("Animal eat");
}
public void eat(int n) { //参数为int型的有参实例方法
System.out.println("Animal eat:"+n);
}
public void eat(String m) { //参数为Str型的有参实例方法
System.out.println("Animal eat:"+m);
}
}
class Dog extends Animal{
public void eat() {
System.out.println("Dog eat");
}
public void eat(int n) { //参数为int型的有参实例方法
System.out.println("Dog eat:"+n);
}
public void eat(String m) { //参数为Str型的有参实例方法
System.out.println("Dog eat:"+m);
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Animal(); //创建一个Animal类的实例对象a
Dog dog = new Dog();
a.eat(); //调用无参的eat方法
a.eat(123); //调用int型参数的eat方法
a.eat("apple"); //调用Str型参数的eat方法
dog.eat();
dog.eat(456);
dog.eat("meet");
}
}