Java中有三大特性,分别是继承,多态,封装;重载和重写是多态的重要体现的两种方式。
一. 重载
- 概念:重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。
- 我们使用重载方法时需要注意以下几点:
(1).在使用重载时只能通过不同的参数列表,必须具有不同的参数列表
(2).不能通过访问权限、返回类型、抛出的异常进行重载
(3).方法的异常类型和数目不会对重载造成影响。
(4).可以有不同的返回值类型,只要参数列表不同就可以
(5).可以有不同的访问修饰符
(6).可以抛出不同的异常 - 例如,你会打篮球,然后你没有篮球的时候你只能蹭别人的篮球打( play()方法 ),然后后面你自己买了一个篮球就打你自己的篮球( play(int a)方法 ),然后你觉得打球需要穿一双球鞋,然后有一天你还自己买了一双球鞋( play(int a,String s)方法 ),然后有一个天你的朋友给你送了一套球服和一个球( play(string s,int a)方法 )。同样都是打篮球,只是因为你所用的装备不同就实现的打球体验。
public class Play {
//1:原方法
public int play(){
System.out.println("蹭球打");
return 1;
}
//2:同名、不同参数、无返回类型(与1对比)
public void play(int a){
System.out.println("打自己的球");
}
//3:同名、不同参数、不同返回类型(与1对比)
public String play(int a,String s){
return "可以穿着自己的球鞋打球";
}
//4:同名、相同返回结果、不同参数顺序(与3对比)
public String play(String s,int a){
return "穿着别人送的球服打别人送的篮球";
}
public static void main(String[] args){
Play o = new Play();
//没球
o.play();
//买了球
o.play(0);
//买了球和球鞋
System.out.println(o.play(1,"a"));
//有人送球服和篮球
System.out.println(o.play("b",2));
}
}
二. 重写
- 概念:方法的重写是指子类中的方法和父类中继承的方法有完全相同的返回值类型、方法名、参数个数和参数类型。这样就可以实现对父类方法的覆盖。当一个子类继承父类时,想要在父类的方法上实现一些新的功能就需要对这个方法重写,来实现新的需求。当子类重写方法之后当调用的话先调用重写的方法,想调用父类的方法的话可以使用super()关键字。
- 重写规则:
(1).父方方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
(2).父类返回的类型必须与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
(3).Java 中规定,被子类重写的方法不能拥有比父类方法更加样额的访问权限。
编写过Java程序的人应该都知道,父类的中方法并不是在任何情况下都可以重写的,当父类中的方法访问权限修饰符为 private时,该方法只能被自己的类访问,不能被外部访问,在子类是不能被重写的。如果定义父类的方法为 public,在子类定义为private 程序运行就会出错。
(4).由于父类的访问权限修饰符限制一定要大于被子类重写的方法的访问权限修饰符,而 private 权限最小,所以如果某一个方法在父类的访问权限是 private 时,那么就不能再子类中对其进行重写。如果重写定义,也只是定义了一个新的方法,不会达到重写的效果。
(5).在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常。而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查异常。
例如:父类的一个方法申明了一个检查异常 IOException ,在重写这个方法时就不能抛出 Exception,只能抛出 IOException的子类异常,可以抛出非检查异常。同样的道理,如果子类创建了一个成员变量,而该变量和父类中一个变量名称相同,称作变量重写或者属性覆盖。 - 注意:
(1)子类中不能重写父类中的final方法
(2)子类中必须重写父类中的abstract方法 - 举个例子,比如你父亲(Father类)有一双特别大的手,在你父亲身上比较和谐比较好看,但是你是个女生(Daughter类),然后这双手(hand()方法)在你身上就比较不和谐,然后就比较丑。
class Father{
public void hand(){
System.out.printhl("好看");
}
}
class Daughter extends Father{
public void hand(){
System.out.printhl("别扭");
}
}
三. 重载和重写的差别