1.重写和重载
重写(Overriding):方法重写又称方法覆盖,重写前提是继承(发生在父类与子类之间),方法名称、参数类型、返回值类型全部相同。
比如人包括中国人,人都会说话,中国人会说汉语还会说英语,此时中国人这个类对人这个类的say()方法即为重写 。
//父类
public class Person {
public void say(){ //不带参方法
System.out.println("都会说话");
}
public void age(String name, int age){ //带参方法
System.out.println("姓名:"+ name + "年龄:"+ age);
}
}
//子类
public class ChinesePerson extends Person{
public void say(){ //重写不带参方法
System.out.println("中国人会说汉语也会说英语");
}
public void age(String name, int age){ //重写带参方法
System.out.println("姓名:"+ name + " 年龄:"+ age+ " 带参的重写");
}
}
//主测试类
public class MainTest {
public static void main(String[] args){
ChinesePerson chinesePerson = new ChinesePerson();
chinesePerson.say();
chinesePerson.age("王可", 24);
}
}
输出为:
中国人会说汉语也会说英语
姓名:王可 年龄:24 带参的重写
重载(Overloading):同一个类中,多个同名方法同时存在,具有不同的参数个数或类型,返回值类型可以相同也可以不同
//方法重载
public class TestOverLoading {
public static void main(String[] args){
TestOverLoading overLoading = new TestOverLoading();
//方法名相同,参数个数不同
overLoading.person(24);
overLoading.person(25, "王可");
}
public void person(int age){ //只带一个参数
System.out.println("年龄:"+age);
}
public void person(int age, String name){ //带两个参数
System.out.println("年龄:"+age +" 姓名:"+name);
}
}
输出为:
年龄:24
年龄:25 姓名:王可
2.重写和重载的原则
重写:
参数列表必须完全与被重写方法的相同;
返回类型必须完全与被重写方法的返回类型相同;
子类函数的访问修饰权限不能少于父类的(public>protected>default>private);
声明为final的方法不能被重写;
声明为static的方法不能被重写,但是能够被再次声明;
子类和父类在同一个包中,子类可以重写父类的所有方法,除了声明为private和final的方法;
子类和父类不在同一个包中,子类只能够重写父类的声明为public和protected的非final方法;
构造方法不能被重写;
重写方法不能抛出新的检查异常或者比被重写方法声明更宽泛的检查型异常,比如父类的一个方法声明一个检查异常IOException,在重写这个方法时只能抛出IOException的子类异常,可以抛出非检查异常。
super关键字:
如需使用父类中原有的方法,可以使用super关键字,该关键字引用了当前类的父类
//子类
public class ChinesePerson extends Person{
public void say(){ //重写不带参方法
super.say();
System.out.println("中国人会说汉语也会说英语");
}
public void age(String name, int age){ //重写带参方法
System.out.println("姓名:"+ name + " 年龄:"+ age+ " 带参的重写");
}
}
输出为:
都会说话
中国人会说汉语也会说英语
姓名:王可 年龄:24 带参的重写
重载:
重载方法必须改变参数列表;
重载方法可以改变返回值类型;
重载方法可以有不同的访问修饰符;
重载方法可以声明新的或更广泛的检查异常;
方法能够在同一个类中或子类中被重载。
3.重写和重载的区别
重写:
父类与子类之间的多态性表现,对父类函数进行重新定义;
方法名称,参数类型,返回值类型全部相同。
重载:
一个类中多态性的一种表现;
不同的参数个数或类型,返回值类型可以相同也可以不同。