前言:方法的重写和重载虽然看似相似,实则不同,二则之间的具体区别,文章会具体分析,以免自己遗忘。
方法的重写
方法的重写必须是子类对父类中的方法不满意,才能在子类中重写父类中的方法。方法的重写必须方法名和参数相同。下面举一个具体的代码示例:
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方法}}
对方法的重写,代码中已经给了详细的解释。通过上述代码可知,方法的重写要满足以下要点,分别从位置、修饰符、返回值、方法名、参数、方法体来分析:
- 位置:方法的重写,是在子类中进行重写。是对父类方法不满意,在子类中对父类方法的重写。
- 修饰符:父类方法的修饰符权限要低于子类方法的修饰符权限。例如:父类中用public修饰,子类中用protected修饰就会出错。正确的格式是:父类中用protected修饰符,子类中用public修饰符,修饰方法。
- 返回值:父类的返回值类型要大于子类的返回值类型。
- 方法名:方法名必须相同
- 参数:参数必须相同
- 方法体:方法体可以不同
方法重载
在前面的学习中,已经学过了方法的重载,不在放具体的代码示例了。方法的重载,只要参数不同即可构成方法的重载。参数不同具体指的是,形参的类型和数量不同。同样的方法的重载也从位置、修饰符、返回值、方法名、参数、方法体来分析: - 位置:方法重载发生在同一个类中
- 修饰符:方法的重载与修饰符无关
- 返回值:与返回值无关
- 方法名:必须相同
- 参数:必须不同
- 方法体:方法体不同
总结
通过对方法重写做代码示例发现,重写和重载是完全不同的东西。对重写和重载还要做进一步的练习,更深一步的理解二者。