对象的特性-继承
- 概念:
- 子类可以直接访问父类的(非私有)成员(方法和变量)。
- 继承主要研究的就是子类内容的共性抽取,前提是符合逻辑的向上抽取。
- 好处:
- 提高了代码的复用性
- 提供了多态的前提
父类:超类、基类
子类:派生类、衍生类
格式:
class 子类 extends 父类{ }
- 注意:
- 子类可以具备特性内容
继承关系中成员变量的特点
- 特点:
- 子类优先使用本类中的变量,如果没有则向上查找父类中是否有该变量,有则使用,没有则编译失败。
- 在子类中调用父类的成员,使用super进行调用。
- 子类访问变量:
- 访问局部变量:直接访问
- 访问成员变量:使用this访问(this表示当前对象)
- 访问父类成员变量:使用super访问(super表示超类对象)
继承关系中成员方法的特点
- 特点:
- 子类优先使用本类中的成员方法;如果没有则有向上查找父类时候有该方法,有则使用,没有则编译失败。
- 重写:@Override
- 概念:子类对父类的功能扩展
- 重写的要求:
- 方法名相同
- 参数列表相同
- 子类重写父类方法的返回类型必须与父类方法返回类型一致,或是父类方法返回类型的子类。
- 子类重写父类方法的范围修饰符必须大于等于父类的修饰符。
- 范围(权限)修饰符:可见范围从大到小
public->protected->[default]->private
继承关系中的构造函数
- 规律:构造方法他一定会重写父类的构造,并且一定会先执行父类的构造,并且一定会写在第一行,默认的你看不见,但是即便你写出来也要写在第一行。
- 任何一个类的构造函数都默认调用了父类默认的无参构造函数。我说:若是重写了构造方法这个无参的就会覆盖,这时候子类是一定要继承一个构造方法的,要么你手写一个无参的,要么把这个有参的给子类继承,并且要写在子类构造的第一行。过程中,无论是重写了无参为有参没有,还是没有写在第一行任何一个细节都会出错。子类构造一定要重写父类的构造。默认重载父类的无参构造,前提是父类有无参构造。本来每个类都有默认无参构造,但是如果类中重写成了有参的构造那么默认的无参的就没了,所以你要给子类构造内写上一个
super(anything);
因为它必须重写父类构造。如果父类只有一个有参构造,那么子类一定要写上一个构造方法,因为你要把这个有参写在你的构造方法内啊,它默认的父类无参构造已经没了,你不写他就相当于没有重写父类方法。 对于构造方法你可以把构造方法写成重载的方式写多个构造方法 - 父类中的私有属性,子类可以通过重载构造函数,并在第一行调用父类的重载构造函数来完成创建子类对象的同时并对属性赋值。不说:子类想要给父类的属性赋值重写构造方法是最好的方式,把父类的构造super();写在子类的构造方法的第一行,如果父类有两个构造一个是有参一个是无参,那么子类不写的情况下会自动隐式的在子类第一行加上super父类构造。如果重写了有参,那一定要把有参写上。并且只能写在第一行,并且即便父类有两个构造也不能写两个父类的构造,因为总有一个是在第二行,这不满足构造函数在第一行的原则。规范:如果子类扩展了父类的参数,大家都喜欢在子类中写两个构造函数,一个是全参的包含所有属性这个任何类都要写的,一个是只包含父类参的。
- 子类中同一个构造函数只能调用父类的一个构造函数,因为父类的构造函数只能出现在子类构造函数的第一行。因为父类的构造必须写在子类构造的第一行,所以执行的时候先执行父类中的构造内容,这也是写在第一行的原因,因为不先有父类哪有子类。没有父哪有子。
super和this的作用
注:
- 调用本类中的构造函数必须放在第一行。我说:调用本类中的其他构造函数这样
this(parameter);
。并且也要和super一样的要写在第一行它和super一个特性,并且不能和super兼容,他俩都争第一行所以不能出现在同一个方法中。 - 构造函数的调用只能出现在构造函数。我说:在一个类中有多个构造函数,其中一个构造想使用
this(parameter);
调用另一个构造写在第一个语句是可以的。但是其中一个方法也想照例调用构造方法是不可以的,方法不能调构造,只有构造能调用构造。 - 本类构造函数的调用不能与父类构造函数并存。我说:上面说了,this();super();的条件是只能被构造调用并且只能出现在构造函数的第一行都要满足。所以注定有人出现在第二行,因此同时只能有一个出现。
一个类中的构造可以相互调用,也可以随意调用父类的构造,只要遵循规则。
super
- 调用父类的成员变量
super.变量;
- 调用父类的成员方法
super.getMethod();
- 调用父类的构造函数
super(parameter);
this
- 调用本类的成员变量
this.变量
- 调用本类的成员方法
this.getMethod();
- 调用本类的构造函数
this(parameter);
继承体系中的注意事项
- Java中类与类之间不能有多继承。我说:类与类之间只有单继承,多借口。接口可以多继承,多接口。
- 一个类可以有多个子类
- 类之间可以有多层继承