1.继承含义
继承:是将多个类相同属性和行为抽取到单独的类中、那么多个类无需再定义这些共性属性和行为,只要继承这个单独类即可继承这些属性和行为了。
设计类与类之间的关系
实际中,一般来说接口实现使用要比继承实用性更强一些。
继承特点:Java中单继承,为了规避多个父类造成的同名问题
简单来说:一个儿子只能有一个爹
单继承 + 接口实现 等价于 多继承(丰富其中的数据共性)
比如:铅笔类 橡皮接口
带橡皮的铅笔——子类
父类——super class 超类 基类
子类——派生类
2.格式
extends
public class 父类{
}
public class 子类名 extends 父类名{
//子类特有的成员变量
//子类特有的成员方法
}
子类是继承父类的所有成员,但是因为权限修饰不同,会造成子类中对于继承的成员可能会有不可见性。
3.继承的优势和劣势
优势:
1)提高代码的复用性
2)提高代码维护性,仅仅限制与父子类中,有时候也是一个弊端。
3)继承后续才会有多态
4)数据共享性(父子类之间)
劣势:
继承关系提高了类与类之间的联系,实际开发中,一般要求降低类与类之间的关联(低耦合性)
ps:耦合性只能降低,不能消除
/*
学生类 : 姓名(name) , 课程名称(course) , 所在班级(className) , 查看课表
(lookForm) , 填写反馈数据(write)
老师类 : 姓名(name) , 课程名称(course) , 部门名称(department) , 查看课表
(lookForm) , 发布试题(release)
设计 : 把学生类 和 老师类的共性内容抽取到一个单独的类中(Person),存储共性内容
父类 : 姓名(name) , 课程名称(course) , 查看课表(lookForm)
*/
public class ExtendsDemo1 {
public static void main(String[] args) {
Student s = new Student();
s.setName("张三");
s.setCourse("Java");
s.setClassName("三年二班");
s.lookForm();
s.write();
}
}
/*
此类定义的是子类的共性成员
*/
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 lookForm(){
System.out.println("查看课表");
}
}
/*
子类只需要定义自己特有的成员,共性的成员需要抽取到父类中
*/
public class Teacher extends Person {
private String department;
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public void release() {
System.out.println("发布试题....");
}
}
4.继承下的内存模型
子类对象
创建子类对象时,在子类内存空间中也会存在父类的数据存储空间
子类创建对象的时候,构造方法是如何调用的(子类构造和父类构造)
5.构造方法
1)子类所有的构造方法都会默认访问父类的无参的默认构造方法
原因:因为子类在初始化时,可能会用到父类的数据,所以通过访问父类的构造,先给父类进行初始化。
public Student() {
super();//访问的是父类的无参构造方法(默认构造方法)
// TODO Auto-generated constructor stub
}
public Student(String className) {
super();
this.className = className;
}
2)如果进行初始化呢 ?
每个构造方法中默认第一条语句都会有一个super()
3)如果父类没有空参数构造 , 那么子类如果进行给父类初始化 ?
子类可以通过super(...)访问父类的有参数构造方法
子类通过this(..)访问子类的有参构造 , 在通过有参构造区访问父类的有参构造 , 不推荐
注意:super(...)和this(...)因为二者都需要放在构造方法的第一条可执行语句,所以二者不能共存。
6.继承下成员的访问规则
成员变量:
访问特点-就近原则(局部有访问则访问局部,局部没有访问的则访问本类成员,本类成员没有则访问父类非私有成员)
成员方法:
访问特点-就近原则:子类有调用子类的,子类没有则调用父类的
7.this和super关键字的区别
this : 代表的是本类的对象
super : 代表的是父类数据存储空间(可以看做成父类的对象)
使用 :
调用变量 :
this.变量名 : 访问本类的成员变量
super.变量名 : 访问父类的成员变量
调用方法 :
this.方法名(...) : 访问本类的成员方法
super.方法名(...): 访问父类的成员方法
调用构造 :
this.构造方法名(...) : 访问本类的构造方法
super.构造方法名(....) : 访问父类的构造方法