方法的重写Overriding和重载Overloading是Java多态性的不同表现。
方法的重载:
什么是方法的重载呢?
方法的重载是指方法名相同,参数类型,参数个数,参数顺序至少有一个不相同的一类方法。在方法体的内部不能使用private、protected、public定义局部变量。被final修饰的形参不能修改其引用中存在的值。
注意:1.如果只有访问修饰符权限改变不构成方法的重载。
2.如果只有返回值类型不同不构成方法的重载。
下面来举一个例子:
public class MethodTest {
String name="成某某";
public String draw(){
System.out.println("画了一个圆");
return "yuan";
}
public void draw(int i){
System.out.println("画了一个正方形");
}
public int draw(String s){
return s.length();
}
public int draw(int b,String s){
System.out.println("draw:"+s+"--"+b);
return b;
}
public int draw(String s,int b){
System.out.println(s+" "+b);
return b;
}
private void test(final int b){
//b++; 这样写会报错,被final修饰的形参不能改变它的值。
int i=0;
i++;
}
}
观察上述的实例:public void draw(int i) { System.out.println("画了一个正方形"); } 如果只改变它的访问权限,改为缺省,
写为: void draw(int i) { System.out.println("画了一个正方形"); } 这样写不能通过编译,会报错,不构成方法的重载。如果只改变它的返回值类型,写为: public int draw(int i) { System.out.println("画了一个正方形"); return i;} 也不能通过编译,会报错,不构成方法的重载。
方法的重写(方法的覆盖):
什么叫方法的重写?
当一个子类要继承父类时,它如果需要重写父类的方法的话必须符合一定的规则。
方法重写的规则:1.子类的方法必须与父类的某个方法的方法名,返回值类型以及参数类型、个数、顺序完全相同。若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
2.子类的方法不能缩小父类方法的访问权限。
3.子类的方法不能抛出比父类方法更多的异常。
4.不能重写标志为final因为final表示最终的意思,不能被修改。
5. 非检查异常:重写方法可以抛出任何非检查的异常,无论被重写方法是否声明了该异常。
6. 检查异常:重写方法一定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常 。但是可以不抛出异常。
下面我来举一个例子:
public class MethodTestSon extends MethodTest{
public void draw(int a){
System.out.println("子类画了一个圆");
}
public int draw(String s){
return 0;
}
public int draw(int a,boolean b){
return a;
}
public int draw(int a,String s){
return a;
}
public void go(){
System.out.println("你走了");
}
public void work(final MethodTest m){
System.out.println(m.name);
m.name="成某某来了";
System.out.println(m.name);
//m=new MethodTest(); 被final修饰的对象,不能改变它的引用,也就是不能改变它的地址;
}