1-什么是继承(extends)
-
继承是将多个类的相同属性和行为抽取到单独一个类中,那么多个类无需再定义这些共性属性和行为,只要继承这个单独类即可继承这些属性和行为了
-
多个类称为子类(派生类),单独的这个类称为父类(基类 或超类)
2-继承的格式
-
使用关键字extends进行连接子类与父类
-
举例 : public class Student extends People{ ... }
public class 父类{
//共性成员
}
public class 子类 extends 父类{
//子类可以使用父类中定义的内容
}
3-继承的好处
-
提高代码的复用性
-
提高代码的维护性
-
让类与类产生了关系(继承关系) , 是多态的前提
举例
/*
运动员类 : 姓名(name) , 项目名称(course) , 所在班级(className) , 查看训练计划(lookplan) , 进行训练(play) 教练类 : 姓名(name) , 项目名称(course) , 部门名称(department) , 查看训练计划(lookplan) , 监督训练(supervise)
设计 : 把运动员类 和 教练类的共性内容抽取到一个单独的类中(Person),存储共性内容
父类 : 姓名(name) , 课程名称(course) , 查看课表(lookplan)
*/
public class test {
public static void main(String[] args) {
Player s = new Player();
s.setName("张三");
s.setCourse("10000m");
s.setClassName("体育1班");
s.lookplan();
s.supervise();//无法执行
}
}
/*
此类定义的是子类的共性成员
*/
public class Person {
private String name;
private String course;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public void lookplan(){
System.out.println("查看训练计划");
}
}
/*
子类只需要定义自己特有的成员 , 共性的成员需要抽取到父类中
*/
public class player extends Person{
private String className;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public void play(){
System.out.println("进行训练");
}
}
/*
子类只需要定义自己特有的成员 , 共性的成员需要抽取到父类中
*/
public class Coach extends Person {
private String department;
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public void supervise() {
System.out.println("监督训练");
}
}
4-继承的特点
-
Java只支持单继承 , 不支持多继承 , 但是可以多层继承
-
简单理解 : 一个儿子只能有一个亲爹
-
-
为什么不支持多继承 ?
-
因为一个子类如果继承多个父类 , 父类有相同的方法声明, 子类会产生继承冲突 , 所以不允许
-
5- 继承中成员的发访问特点
-
成员变量
-
访问特点-就近原则 : 局部有访问局部的 , 局部没有访问本类成员的 , 本类成员没有访问父类非私有成员
-
-
成员方法
-
访问特点-就近原则 : 子类有调用子类的 , 子类没有调用父类的
-
-
构造方法
-
子类所有的构造方法都会默认去访问父类的空参数构造方法
-
原因 : 因为子类在初始化时 , 可能会用到父类的数据 , 所以通过访问父类的构造 , 先给父类进行初始化
-
-
如果进行初始化呢 ?
-
每个构造方法中默认第一条语句都会有一个super()
-
-
如果父类没有空参数构造 , 那么子类如果进行给父类初始化 ?
-
子类可以通过super(...)访问父类的有参数构造方法
-
子类通过this(..)访问子类的有参构造 , 在通过有参构造区访问父类的有参构造 , 不推荐
-
-
注意事项 :
-
super(...) 和 this(...) 因为二者都需要放在构造方法的第一条可执行语句, 所以二者不能共存
-
-
6-方法重写
-
什么是方法重写 ?
-
子类和父类出现了一模一样的方法的声明(方法名 , 参数列表)
-
-
为什么要学习方法重写 ?
-
当子类需要使用父类的功能 , 但是父类的功能又满足不了子类 , 那么子类需要重写 , 这样既可以使用父类的功能 ,也可以增加新的功能
-
-
如果进行方法重写 ?
-
子类和父类的方法声明一样 , 方法体中的内容重新定义
-
-
Override注解是做什么的,有什么用?
-
@Override是放在重写后的方法上,作为重写是否正确的校验注解,加上该注解后如果重写错误,编译阶段会出现错误提示。建议重写方法都加@Override注解,代码安全,优雅!
-
-
方法重写的注意事项 ?
-
私有的方法无法重写
-
重写的方法与被重写的方法 , 名字 , 参数列表需要保持一致
-
子类重写父类方法时,子类方法访问权限必须大于或者等于父类方法权限 (暂时了解 :缺省 < protected < public)
-
一般保持一致即可
-
-