继承
1. 为什么使用继承
1.1. 问题提出
我们经常会遇到这种情况:定义的两个类具有一部分相同的属性和方法,如何避免重复写这些相同的属性呢?下面是宠物游戏里的一个狗类和企鹅类,具有相同的属性:昵称、健康值、与主人的亲密度,具有相同的方法:自我介绍方法
1.2. 继承的思想
Java中使用继承对上面的问题进行优化,把相同的属性和方法抽象到一个父类中,子类通过继承父类获得这部分属性和方法,上面的狗类和企鹅类可以继承与一个父类宠物类
2. 如何使用继承
2.1. 步骤
- 编写父类
//宠物类
Class Pet{
//公共的属性和方法
}
- 编写子类
//狗类
Class Dog extends Pet{
//子类特有的属性和方法
}
//企鹅类
Class Penguin extends Pet{
//子类特有的属性和方法
}
2.2. 子类访问父类
使用super关键字,代表父类对象
1.访问父类构造方法,必须在子类构造方法的第一句中调用,如果没调用会自动调用父类的无参构造方法
super();
super(参数列表);
2.访问父类属性
super.属性名;
3.访问父类方法
super.方法名();
2.3. 不能被继承的父类的资源
1.private成员
2.子类和父类不在同一个包,使用默认访问权限的成员
3.构造方法
2.4. 访问修饰符
protected可以修饰属性和方法,本类、同包、子类可以访问
访问修饰符总结
2.5. 多重继承关系的初始化顺序
自上而下加载,父类的无参构造可以忽略,默认在加载子类构造方法时直接加载
代码示例:
1.定义人类,包含一个无参构造方法,一个有参构造方法
//人类
public class Person {
String name;
public Person(){
System.out.println("Person无参构造");
}
public Person(String name){
this.name=name;
System.out.println("Person带参构造");
}
}
2.定义学生类,继承人类,重写父类的无参构造方法和有参构造方法
//学生类
public class Student extends Person{
String school;
public Student() {
super();
System.out.println("Student无参构造");
}
public Student(String name,String school) {
super(name);
this.school=school;
System.out.println("Student带参构造");
}
}
3.定义博士类,继承学生,重写父类的无参构造方法和有参构造方法
//博士类
public class Doctor extends Student {
String hobby;
public Doctor(){
super();
System.out.println("Doctor无参构造");
}
public Doctor(String name,String school,String hobby){
super(name,school);
this.hobby=hobby;
System.out.println("Doctor带参构造");
}
}
4.定义测试类,分别用有参构造和无参构造方法创建实例
public class MultiInherit {
public static void main(String[] args) {
System.out.println("***无参构造初始化顺序***");
// 无参构造创建Doctor对象
Doctor doctor=new Doctor();
System.out.println("***有参构造初始化顺序***");
//带参构造创建Doctor对象
Doctor doctor1=new Doctor("zhangsan","万和","打球");
}
}
5.运行结果
从运行结果可以看出,初始化顺序从上到下,依次调用了Person、Student、Doctor等的构造方法。
3. 方法重写
3.1. 方法重写的规则
- 方法名相同
- 参数列表相同
- 返回值类型相同或子类
- 访问权限不能严于父类
3.2. 代码示例:
1.定义宠物类
public class Pet {
String name="大大";//宠物的姓名
int health=100;//宠物的健康度
int love=0;//宠物与主人亲密度
//宠物自白方法
public void show(){
System.out.println("自白:名字:"+this.name+",健康值:"+health+",亲密度:"+love);
}
}
- 定义狗狗类,继承宠物类,并重写自白方法
public class Dog extends Pet{
private String strain;//狗狗品种
//对父类的方法重写
public void show(){
System.out.println("自白:名字:"+this.name+",品种:"+strain+",健康值:"+health+",亲密度:"+love);
}
//品种属性的写方法
public String getStrain() {
return strain;
}
//品种属性的读方法
public void setStrain(String strain) {
this.strain = strain;
}
}
4.编写测试类
public class PetsTest {
public static void main(String[] args) {
// 创建狗类对象
Dog dog=new Dog();//实例化一只狗狗
dog.setStrain("金毛");//对狗狗的品种进行写操作
dog.show();//调用狗狗自白方法
}
}
- 运行结果
调用了重写后的自白方法
4. Super关键字
1.只能出现在子类的方法和构造方法中
2.调用构造方法时,只能是第一句
3.不能访问父类的private成员