重写(Override)
重写是子类对父类的允许访问的非静态,非private,非final方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的规则
- 参数列表与被重写方法的参数列表必须完全相同。
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父子类关系(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
- 访问修饰权限不能比父类中被重写的方法的访问修饰权限更低(public 、protected 、default 、private 权限依次增加)
- 父类被static, private, final修饰的方法不能被重写
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private 和 final 的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和 protected 的非 final 方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以
- 构造方法不能被重写。
class Father{
public void eat(){
System.out.println("吃饭!");
}
public void work(){
System.out.println("工作!");
}
}
class Son extends Father{
@Override
public void work(){
super.work(); // 在子类中可以使用super关键字调用父类方法
System.out.println("学习!");
}
}
重载(Overload)
重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
//构造器的重载
//定义一个"人"类
public class Person {
//属性
String name;
int age;
//空构造器(一般保证空构造器的存在,空构造器一般不会进行属性的赋值操作,默认不写也存在)
public Person() {}
//重载构造器,一般会重载构造器,在重载的构造器中进行属性的赋值操作
public Person(String name,int age) {
//在要表示对象的属性前加上this.来修饰,因为this代表的就是你创建的那个对象
this.name = name;
this.age = age;
}
//主方法
public static void main(String[] args) {
//创建一个名为person的对象,利用重载的构造器对其进行属性的赋值操作
Person person = new Person("李四",18);
System.out.println(person.name);
System.out.println(person.age);
}
}
重载的规则:
- 在一个类中,方法名相同,参数不同(个数,类型,顺序不同)
- 方法重载与访问修饰符,返回值类型,方法参数的名字都没有关系。
class Hello {
public void hello() {
System.out.println("Hello, world!");
}
public void hello(String name) {
System.out.println("Hello, " + name + "!");
}
public void hello(String name, int age) {
if (age < 18) {
System.out.println("Hi, " + name + "!");
} else {
System.out.println("Hello, " + name + "!");
}
}
}
总结
方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
- 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载。
- 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写。
- 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。