前言:方法的重写和重载虽然看似相似,实则不同,二则之间的具体区别,文章会具体分析,以免自己遗忘。
方法的重写
方法的重写必须是子类对父类中的方法不满意,才能在子类中重写父类中的方法。方法的重写必须方法名和参数相同。下面举一个具体的代码示例:

package com.msb11;
public class Person {
 //因为方法的重写只是针对方法的,所以属性呀,构造器呀先不用管。
 //定义eat方法
 private Person eat(){
 System.out.println(“这个是父类中定义的eat方法:”);
 return new Person();//对person类new了一个对象,new person便是new的对象的地址,
 //这个是引用数据类型,返回的要是引用数据类型的话,new谁,返回值类型处
 //就填谁。可以发现new一个person不返回person,就会报错。
 }
 public void sleep(){
 System.out.println(“这个是父类中定义的sleep方法:”);
 }
 }

下面是个子类:

package com.msb11;
public class Student extends Person { //说明student这个类继承自父类Person
 //在子类中可以定义子类所独有的方法
 //定义study方法
 public void study(){
 System.out.println(“这个是子类中所独有的方法”);
 }
 //对父类中的方法进行重写
 public Student eat(){
 //可以发现,当子类student用protected修饰eat方法,而父类person用public修饰eat方法时,
 //报错了,子类的权限修饰符要高于父类的权限修饰符。
 System.out.println(“这个是对父类中的方法进行重写之后的方法:”);
 return new Student();//new一个student,就要在返回值类型处填写student,否则就会报错
 //同时,对方法重写,子类的返回值类型要低于父类。
 }
 }

下面是一个测试类:

package com.msb11;
public class Test {
 public static void main(String[] args) {
 //无论是调用子类中的方法,还是调用父类中的方法。在静态上下文
 //中都要定义一个对象才能够调用。否则会报错,也可以把子类还有父类中
 //定义的方法用static修饰,这样在main方法这个静态上下文中就可以调用了。但是一般不这样。我
 //定义一个对象,来调用这些方法。
 //创建一个基于student类的对象
 Student s=new Student();
 //s.eat(); //调用父类的eat方法
 //假设我们对父类中定义的方法不满意,进行方法的重写。在子类中对父类的方法进行重写
 s.eat();
 //通过运行结果可知,对父类中的方法重写之后,调用的是子类中的eat方法}}

对方法的重写,代码中已经给了详细的解释。通过上述代码可知,方法的重写要满足以下要点,分别从位置、修饰符、返回值、方法名、参数、方法体来分析:

  1. 位置:方法的重写,是在子类中进行重写。是对父类方法不满意,在子类中对父类方法的重写。
  2. 修饰符:父类方法的修饰符权限要低于子类方法的修饰符权限。例如:父类中用public修饰,子类中用protected修饰就会出错。正确的格式是:父类中用protected修饰符,子类中用public修饰符,修饰方法。
  3. 返回值:父类的返回值类型要大于子类的返回值类型。
  4. 方法名:方法名必须相同
  5. 参数:参数必须相同
  6. 方法体:方法体可以不同
    方法重载
    在前面的学习中,已经学过了方法的重载,不在放具体的代码示例了。方法的重载,只要参数不同即可构成方法的重载。参数不同具体指的是,形参的类型和数量不同。同样的方法的重载也从位置、修饰符、返回值、方法名、参数、方法体来分析:
  7. 位置:方法重载发生在同一个类中
  8. 修饰符:方法的重载与修饰符无关
  9. 返回值:与返回值无关
  10. 方法名:必须相同
  11. 参数:必须不同
  12. 方法体:方法体不同
    总结
    通过对方法重写做代码示例发现,重写和重载是完全不同的东西。对重写和重载还要做进一步的练习,更深一步的理解二者。