类的继承和派生
Java把允许重用现有类称为基类(超类或父类),由基类派生出来的类称为派生类(子类)。
Java 类的继承主要通过 extends 关键字来完成的。一旦继承后,子类将获得父类的成员属性跟成员方法。
基本语法:
class 类名 extends 父类名 {
}
如果没有指定的父类,那么 java 编译器默认 Object 就是该类的父类。
public class Animal {
private String name ;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println(name+"吃饭");
}
}
public class Dog extends Animal{
private String sex;
public Dog(String name,int age,String sex){
super.(name,age); //编译器默认调用的时父类的默认构造方法super.() —— 可以省略。如果父类只有一个带参数的构造方法,这里不能省。
this.sex = sex;
}
public void eatMeat(){
System.out.println(name+"吃肉");
}
}
方法的重载和重写
1.方法的重载
重载(Overload) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(包括构造方法)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
public void fun(){
System.out.println("fun()");
}
public void fun(int a){
System.out.println("fun(int)");
}
public void fun(short a){
System.out.println("fun(short)");
}
public void fun(int a,int b){
System.out.println("fun(int,int)");
}
方法重载的规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载(子类不能重载父类的构造方法)。
- 无法以返回值类型作为重载函数的区分标准
2.方法的重写
重写(Override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
class Animal{
protected String name;
protected int age;
protected String sex;
public Animal(String name){
this.name=name;
}
public void eat(){
System.out.println("Animal eat");
}
}
class Cat extends Animal{
protected String name; //将父类 Animal 中的变量 name 进行隐藏
@Override
public void eat(){ //进行方法的覆盖(重写)
System.out.println("Cat eat");
}
public void catchMice(){
System.out.println(super.name); //访问父类的成员变量
super.eat(); //访问父类的成员方法
System.out.println(name+"catchmice");
}
}
方法重写应满足的条件:
- 派生类中该方法的返回值和基类同名方法的返回值相同,参数列表相同。
- 派生类中的重写方法的访问权限不能比基类小。权限的顺序为:public,protected,private。
- 基类的 abstract 方法必须被派生类重写,否则派生类也必须是 abstract
- 基类的 final 方法不能被派生类重写
- 基类的static方法不能被重写
- 父类方法使用 private 声明不可以被重写
3.重载与重写之间的区别
区别 | 方法重载 | 方法重写 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
访问权限 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |