方法重写和方法重载的区别?

**方法重载:overload
一个类中你有了一个方法A,在这个类中你又写了一个方法B,
方法A和方法B的方法名一样,但参数不同,返回值类型不同,与返回值无关,此时方
法B重载了方法A;
参数不同体现在:
(1): 参数类型不同;
(2): 参数个数不同;
(3): 参数顺序不同;
例如:
public class TestClass{
方法A:
public int add (int a,int b){
return a+b;
}
方法B:
public int add (float a){
return a+b;
}
}
此时方法B重载了方法A.

            **  方法重写override:
                一个类TestClass2继承了另一个类TestClass1,TestClass1类中有一个方法A,此时TestClass2写了一个方法B,方法B 和方法A 的

名字,返回值类型以及参数全部一样,此时方法B重写了方法A;
如何定义重写:在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。重写体现了Java优越
性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。在Java中覆盖继承父类的方法就是通过方法的重写来实现的。

所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。

方法A:
public class TestClass1{
public int test (int i) {
return 1;
}
}
方法B继承方法A:
public class TestClass2 extends TestClass1{
public int test(int i){
return 2;
}
}

            然后在main方法中创建子类的对象调用方法test,运行结果是子类的test方法;   

        可以看出,当子类重写了父类中的print()方法后,使用S调用的是子类的print()方法,父类中的print()方法被覆盖了。也就是说,如果现在子类将父类中的方法重写了,调用的时候肯定是调用被重写过的方法,那么如果现在一定要调用父类中的方法该怎么办呢?此时,通过使用.. super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。

      方法A:

public class TestClass1{
public int test (int i) {
return 1;
}
}
方法B继承方法A:
public class TestClass2 extends TestClass1{
public int test(int i){
super.test("访问父类被覆盖的方法");
return 2;
}
}

     在mian方法中创建子类对象调用test方法,运行结果是
     父类被覆盖的test方法和子类的test方法;

**方法重写注意事项

(一) 父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
(二) 父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。
(三) Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。访问权限大小关系为:

编写过Java程序的人就知道,父类中的方法并不是在任何情况下都可以重写的,当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时就会报错。例如:

class Person
{public void print()(//public访问权限
System.out.println( "父类Person的print方法! ");
}
}
Class Stedent extends Person
{private void print()(//重写方法降低了访问权限,错误
System.out.println( "子类Student的print方法!" );
}
}
(四) 由于父类的访问权限修饰符的限制一定要大于被子类重写方法的访问权限修饰符,而private权限最小。所以如果某一个方法在父类中的访问权限是private,那么就不能在子类中对其进行重写。如果重新定义,也只是定义了一个新的方法,不会达到重写的效果。

(五) 在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章