继承是我们Java面向对象的三大特征之一:
继承是为什么出现的,它能为我们解决什么样的问题呢?
在学习继承之前,我们先来说一下Java面向对象的另一个特征——封装,什么是封装?
封装呢就我们所说的对象,我们要封装一个什么样的对象,那我们就要相应的封装一个对应的数据,以及对应的行为,接下来我们用实列说明一下:
我们现在要封装一个Student对象,属性有:name,age,gender,address;对应的行为有:eat,sleep,study。那我们就可以这样写:
public class Student {
private String name;
private int age;
private String gender;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
// 行为:sleep
public void sleep(){
System.out.println("睡觉");
}
// 行为:eat
public void eat(){
System.out.println("吃饭");
}
// 行为:study
public void study(){
System.out.println("学习");
}
}
然后我们再封装一个Teacher对象,他的属性有:name,age,gender,address;行为有:eat,sleep,teach;
public class Teacher {
private String name;
private int age;
private String gender;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
// 行为:sleep
public void sleep() {
System.out.println("睡觉");
}
// 行为:eat
public void eat() {
System.out.println("吃饭");
}
// 行为:teach
public void teach() {
System.out.println("上课");
}
}
经过观察,我们会发现,这两个对象中,我们重复的代码是不是很多,首先就是两个对象的属性是不是一样的所以他的 get/set 方法就一样,然后就是两个对象是不是也有相同的行为:eat 和sleep。那我们这样写代码重复率太高了,还麻烦,有没有什么解决方法呢?
好的,为了解决这个问题啊,Java的继承特征也就出现:
首先,我们先将重复的代码给提取出来,放到Person这个类里面,
然后Java为我们就提供了 extends 关键字,我们使用这个关键字就可以让我们的一个类和另一个类建立起继承的关系。我们来实操一下:
Person.java
public class Person {
private String name;
private int age;
private String gender;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
// 行为:sleep
public void sleep(){
System.out.println("睡觉");
}
// 行为:eat
public void eat(){
System.out.println("吃饭");
}
}
Student.java
public class Student extends Person{
// 行为:study
public void study(){
System.out.println("学习");
}
}
Teacher.java
public class Teacher extends Person {
// 行为:teach
public void teach() {
System.out.println("上课");
}
}
我们将Person.java类称为父类(基类或超类),将Student.java类和Teacher.java类称为子类(派生类)。
下面我们写一个测试类来测试一下
public class TestExtend {
public static void main(String[] args) {
Student student = new Student();
student.setName("lisi");
student.setAge(18);
student.setGender("男");
student.setAddress("云南");
student.sleep();
student.study();
Teacher teacher = new Teacher();
teacher.setName("zhanglaoshi");
teacher.setAge(25);
teacher.setGender("女");
teacher.setAddress("北京");
teacher.sleep();
teacher.teach();
}
}
继承的好处是什么呢:
1、可以把多个子类中重复的代码抽取到父类中,提搞代码的复用性
2、子类可以再父类的基础上,增加其他的功能,使子类更加强大
继承中,还有一个点需要重点关注一下,那就是子类到底能继承父类中的哪些内容?