1.什么是继承?
生活中:
继承 ---> 延续
---> 扩展
代码中:
继承 ---> 重复使用已有的类的代码(复用)
---> 扩展已有类的代码(扩展)
2.为什么要继承?
① 代码的复用和扩展
② 满足is - a 的关系
事物的分类来说,子类别的关系
Student is a Person.
Teacher is a Person
Car is not a Person
3.如何继承
关键字:extends
语法格式:
【修饰符】 class 子类名 extends 父类名{
}
子类:SubClass,又称为派生类
父类:SuperClass,又称为基类,超类
子类表示的事物范围大,还是父类表示事物的范围大?
如:Person类(人)是父类
Student类(学生)是子类
子类 < 父类
子类更具体,里面的成员描述更多
父类更抽象,笼统的描述信息更少
4.继承有什么特点?
① 子类会继承父类所有的实例变量和实例方法,如果理解这句话?
A:虽然子类继承了父类的所有实例变量和实例方法。但是因为权限修饰符的原因,某些成员在子类中不能直接使用,可以间接使用。private修饰的成员,在子类中是不能直接使用的。权限修饰符缺省的成员,在跨包的子类中是不能直接使用的。本包子类可以。
B:这里说的继承所有,是说,子类代表的这个事物,它具备父类中所描述的所有特征。
类的定义:一类具有相同特征的事物的抽象描述。
例如:Person类中有name,age属性,eat()方法
这些特征无论它是否私有,对于子类Student类,它都应该有这个特征。
C:既然是子类继承了所有的实例变量,那么在子类对象创建时,需要在子类对象的堆空间中开辟对应的内存来存它的值。
D:所谓的继承,不是说,父类的代码在子类中完全重复一遍,而是在使用子类时,除了可以用自己本类声明的成员,还可以去父类中寻找可以(看权限修饰符)用的成员。
② java中只支持单继承,即一个子类只能有一个“直接”父类
比喻:一个人只有一个亲生父亲
③ java支持多层继承
比喻:祖宗很多代,代代相传
④ 一个java父类,可以同时有多个子类
Idea中,选中某个类,Ctrl + H,查看继承关系
选中某个类,Ctrl + Alt + U,以继承树的方式查看继承关系
5.继承后调用父类声明的属性和方法
在继承的时候,子类会继承父类所有的成员变量(实例变量)和成员方法(实例方法)
既然可以继承,
① 在子类外面,子类的对象是否可以使用父类中声明的成员变量和成员方法,只要权限修饰符允许,通过子类对象可以直接使用父类中声明的成员变量和成员方法
② 在子类中,如果要用到父类声明成员变量和成员方法,只要权限修饰符允许,可以直接使用,不需要通过“对象 . ” 的方式来引用父类中声明的成员变量和成员方法。
练习代码:
Person类:
① 声明父类:Person类
- 包含属性:姓名,年龄,性别,属性私有化,
- 包含get/set方法
- 包含getInfo()方法:例如:姓名:张三,年龄:23,性别:男
public class Person {
private String name;
private int age;
private char gender;
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 char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getInfo(){
return "姓名:" + name +",年龄:" + age + ",性别:" + gender;
}
}
Student类代码:
② 声明子类:Student类,继承Person类
- 新增属性:score成绩,属性私有化,
- 包含get/set方法
- 重写getInfo()方法:例如:姓名:张三,年龄:23,性别:男,成绩:89
public class Student extends Person{
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String getInfo() {
return super.getInfo() + ",成绩:" + score;
}
}
Teacher类代码:
③ 声明子类:Teacher类,继承Person类
- 新增属性:salary薪资,属性私有化,
- 包含get/set方法
- 重写getInfo()方法:例如:姓名:张三,年龄:23,性别:男,薪资:10000
public class Teacher extends Person {
private double salary;
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String getInfo() {
return super.getInfo() + ",薪资:" + salary;
}
}
TestPerson类代码:
④ 在测试类的main方法中创建三个类的对象,并调用相应的方法测试
public class TestPerson {
public static void main(String[] args) {
Person p = new Person();
p.setName("张三");
p.setGender('男');
p.setAge(25);
System.out.println(p.getInfo());
Student s = new Student();
s.setName("张三丰");
s.setAge(5);
s.setGender('男');
s.setScore(89);
System.out.println(s.getInfo());
Teacher t = new Teacher();
t.setName("柴林燕");
t.setAge(18);
t.setGender('女');
t.setSalary(10000);
System.out.println(t.getInfo());
}
}