Java学习之继承

1. 为什么使用继承

1.1. 问题提出

我们经常会遇到这种情况:定义的两个类具有一部分相同的属性和方法,如何避免重复写这些相同的属性呢?下面是宠物游戏里的一个狗类和企鹅类,具有相同的属性:昵称、健康值、与主人的亲密度,具有相同的方法:自我介绍方法

1.2. 继承的思想

Java中使用继承对上面的问题进行优化,把相同的属性和方法抽象到一个父类中,子类通过继承父类获得这部分属性和方法,上面的狗类和企鹅类可以继承与一个父类宠物类

2. 如何使用继承

2.1. 步骤

  1. 编写父类
//宠物类
Class Pet{
	//公共的属性和方法
}
  1. 编写子类
//狗类
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.定义人类,包含一个无参构造方法,一个有参构造方法

扫描二维码关注公众号,回复: 6050333 查看本文章
//人类
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. 方法重写的规则

  1. 方法名相同
  2. 参数列表相同
  3. 返回值类型相同或子类
  4. 访问权限不能严于父类

3.2. 代码示例:

1.定义宠物类

public class Pet {
	String name="大大";//宠物的姓名
	int health=100;//宠物的健康度
	int love=0;//宠物与主人亲密度
	//宠物自白方法
	public void show(){
		System.out.println("自白:名字:"+this.name+",健康值:"+health+",亲密度:"+love);
	}
}
  1. 定义狗狗类,继承宠物类,并重写自白方法
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();//调用狗狗自白方法
	}
}
  1. 运行结果
    在这里插入图片描述
    调用了重写后的自白方法

4. Super关键字

1.只能出现在子类的方法和构造方法中
2.调用构造方法时,只能是第一句
3.不能访问父类的private成员

猜你喜欢

转载自blog.csdn.net/sinat_41628872/article/details/89341367