概念
将多个类的共性内容抽取放在一个独立的类中,独立类和这些类产生继承关系,就是继承关系。
继承是基于面对对象的思想,多个对象可以提炼相同点以类为模板,减少代码冗余,多个类也可以提炼共同的特征,创建一个父类,通过继承的方法减少代码冗余以及提高复用性。
优点
- 能提高代码复用性;
- 提高了代码的维护性;
- 让类与类之间产生联系,是多态的前提;
缺点
让类与类之间产生了耦合性,有背设计开发的低耦合,高内聚的原则;
继承的特点
子类只能单继承父类,可以多层继承。
继承 类的组成
1成员变量
2构造方法
3成员方法
继承的成员访问:
- 变量的访问:子类继承父类,如果子类的成员变量名称和父类的成员变量名称不一致的时候,分别访问即可,
子类变量和名称不同时:(就近原则)
先在本类的局部位置找,如果没有就在本类成员位置里找,没有就在父类的成员位置里找,父类成员位置都没有说明该变量不存在。 - 构造方法的访问:子类继承父类,不能够继承构造方法,但是可以通过Super()间接访问,子类所有的构造方法都默认有一个super();访问父类的无参构造方法。
super代表的是父类的空间标识,this代表本类。
由于子类继承必须先初始化父类,所以建议永远给出父类的无参构造
如果子类继承父类,父类没有无参构造方法,怎么解决
- 手动给出父类的无参构造方法;
- 子类的构造方法中,用super(xx);访问父类的有参构造方法进行初始化;
- 不执行子类的无参构造方法,先通过this(xx);执行本类的有参构造方法,再通过super();执行父类的有参构造方法进行初始化。
this和super的区别
this:代表对本类对象的地址值引用;
super:代表对父类空间标识(父类对象的地址值引用)
this.变量:访问本类的成员变量;
this.方法名():访问本类的成员方法;
this()/this(xx):访问本类的无参构造方法/有参构造方法;
super.变量名:访问的是父类的成员变量;
super.方法名():访问父类的成员方法;
super()/super(xx):访问父类的无参构造方法/有参构造方法;
分层初始化
和代码块的优先级
父类比子类先一步初始化;
静态代码块随类的加载而加载;
使用构造方法前先调用构造代码块;
class Person{
static{
System.out.println("Person的静态代码块") ;
}
public Person(){
System.out.println("Person的无参构造方法") ;
}
{
System.out.println("Person的构造代码块") ;
}
}
class Student extends Person{
static{
System.out.println("Student的静态代码块") ;
}
public Student(){
System.out.println("Student的无参构造方法") ;
}
{
System.out.println("Student的构造代码块") ;
}
}
//测试类
class Test3{
public static void main(String[] args){
Student s = new Student() ;
System.out.println("--------") ;
Student s2 = new Student() ;
}
}
输出结果:
Person的静态代码块
Student的静态代码块
Person的构造代码块
Person的无参构造方法
Student的构造代码块
Student的无参构造方法
--------静态代码块只随类的加载时加载一次,构造方法块随构造方法的调用而调用。
Person的构造代码块
Person的无参构造方法
Student的构造代码块
Student的无参构造方法
final关键字
状态修饰符,可修饰类,变量,方法,
修饰变量时,该变量是一个常量,只能被赋值一次;
修饰方法时,方法不能被重写;
修饰类时,该类不能被继承;
当不想被子类重写覆盖的父类,可以使用final关键字进行修饰