前言:其实java的重载和重写没有什么联系,这是名字相似
1、重载和重写的实际应用举例
重载:
1、当定义方法的时候,“方法名”相同,“形参”不同时为重载
class Students(){
int age;
puclic int guessAge(){
age = 18;
retuen age;
}
public int guessAge(int age){
age = 29;
return age;
}
}
重写(目的--父类命名过方法A后,子类想在方法A的基础上进行修改,所以增加了重写的概念):
1、当继承时,父类定义一个方法后, 子类继承后又想要修改父类中的此方法,需要用到重写;重写时,子类定义的方法和夫类定义的“方法名” 和“形参”必须相同,里面的内容不同;
Person类--父类
package com.test.p4;
public class Student extends Person{
String major; //专业
public Student(){
}
public Student(String name, int age, String major){
this.name = name;
setAge(23);
this.major = major;
}
public void study(){
System.out.println("student学习专业课");
}
public void print(){
System.out.println("name: " + name + " age: " + getAge());
}
public void eat(){
System.out.println("测试重写,这是子类studnt类里写的吃");
}
}
Student类--子类
package com.test.p4;
public class Student extends Person{
String major; //专业
public Student(){
}
public Student(String name, int age, String major){
this.name = name;
setAge(23);
this.major = major;
}
}
public void eat(){
System.out.println("测试重写,这是子类studnt类里写的吃");
}
}
测试类
package com.test.p4;
public class ExtendsTest {
public static void main(String[] args) {
Student s1 = new Student();
s1.eat();
}
}
结果:
测试重写,这是子类studnt类里写的吃
Process finished with exit code 0
2、重写的规定介绍(方法名/权限修饰符/返回值)
- 子类重写的方法的“方法名”和“形参列表”与父类被重写的“方法名”和“形参列表”相同(因为重写的意思就是重新写,如果形参不同就相当于重载了)
- 子类重写的方法的权限修饰符 不小于 父类被重写的方法的权限修饰符(相当于新的如果想要完全覆盖以前重新开始的化,必须要和原来的相同或者更大)
特殊情况:子类不能重写父类中声明的private权限的方法(因为父类声明private权限后,相当于自己的隐私被隐藏了,子类是看不到的,因此无法重写)
3. 返回值类型:
- 父类被重写的方法的返回值是void,则子类重写的方法的返回值类型只能是void
- 父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类型或A类的子类
- 父类被重写的方法的返回值类型是基本数据类型(如:double、int),则子类重写的方法的返回值类型必须是相同类型
- 子类和父类中的同名同参数的方法要么都声明为static(此时可以考虑重写),要么都声明为static(此时不能考虑重写了)
注:权限修饰符相当于 父类 <= 子类;
返回值类型相当于 父类 包括 子类