目录
一.方法重载(overloading)
二.重载的规则
三.方法重写(overriding)
四.重写的规则
五、访问修饰符
六、总结
重写与重载之间的区别
方法重载:
方法重写:
方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。
方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。
在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法。
当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只能重载构造函数
重载方法参数表必须不相同;
重载方法可以在一个类中或其他类中;
重载方法方法名必须相同;
重载方法与返回值类型和访问修饰符无关;
//创建一个方法
public void study(){
System.out.println("好好学习");
}
//方法名相同,参数不同
public void study(String name){
System.out.println("好好学习天天向上");
}
//与返回值和访问修饰符无关
private String study(String name,String type){
System.out.println("好好学习天天向上!!!");
return name;
}
在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。
子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。
重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。
在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
此时,通过使用super关键字就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。
如果要使用super关键字不一定非要在方法重写之后使用,也可以明确地表示某个方法是从父类中继承而来的。使用super只是更加明确的说,要从父类中查找,就不在子类查找了。
重写的好处在于子类可以根据需要,定义特定于自己的行为。
也就是说子类能够根据需要实现父类的方法。
方法重写参数表必须相同;
方法重写方法名必须相同;
方法重写必须继承父类,是父类的子类;
方法重写返回值相同或者是其子类;
方法重写访问修饰符不能比父类更严格;
在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查型异常。
//动物类--父类
class Animal(){
private void run(){
System.out.println("动物在跑");
}
}
//狗类--子类
class Dog extends Animal(){
public void run(){
System.out.println("狗在跑");
}
}
//测试类
public class DogTest(){
public static void main(String[] args){
//创建动物类对象
Animal animal = new Animal();
//创建狗类对象
Dog dog = new Dog();
//调用方法
animal.run();
dog.run();
}
}
//运行结果
//动物再跑
//狗在跑
请观看下面一组代码:
class Animal{
public void run(){
System.out.println("动物在跑");
}
}
class Dog extends Animal{
public void run(){
System.out.println("狗在跑");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.run();// 执行 Animal 类的方法
b.run();//执行 Dog 类的方法
b.bark();
}
}
//以上实例编译运行结果如下:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
b.bark();
该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。
Super关键字的使用
当需要在子类中调用父类的被重写方法时,要使用super关键字。
class Aniaml(){
public class study(){
//super.方法名
super.run();
System.out.println("狗在跑");
}
}
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
private | √ | × | × | × |
默认 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
区别点 | 重载方法 | 重写方法 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |