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;}@Overridepublic 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;}@Overridepublic 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());}
}