2.1 继承快速入门

子类对象实际上是由子、父类两张设计图共同创建出来的。

1、什么是继承? 继承后有啥特点?
继承就是用extends关键字,让一个类和另一个类建立起一种父子关系。
子类可以继承父类非私有的成员。
2、带继承关系的类,Java会怎么创建它的对象?对象创建出来后,可以直接访问哪些成员?
带继承关系的类,java会用类和其父类,这多张设计图来一起创建类的对象。
对象能直接访问什么成员,是由子父类这多张设计图共同决定的,这多张设计图对外暴露了什么成员,对象就可以访问什么成员(非私有的成员)。
2.2 继承的好处

关于继承的好处我们只需要记住:继承减少重复代码的编写,可以提高代码的复用性
2.3 权限修饰符


2.4 单继承、Object
Java语言只支持单继承,不支持多继承,但是可以多层继承。就像家族里儿子、爸爸和爷爷的关系一样:一个儿子只能有一个爸爸,不能有多个爸爸,但是爸爸也是有爸爸的。
Object类 :
Object类是java所有类的祖宗类。我们写的任何一个类,其实都是object的子类或子孙类。
1、继承相关的两个注意事项?
Java是单继承的:一个类只能继承一个直接父类;Java中的类不支持多继承,但是支持多层继承。
Object类是Java中所有类的祖宗。
2.5 方法重写
什么是方法重写
当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
注意:重写后,方法的访问遵循就近原则。
-
- 重写小技巧:使用Override注解,它可以指定java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。
-
- 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限
public > protected > 缺省
-
- 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
-
- 私有方法、静态方法不能被重写,如果重写会报错。
关于这些注意事项,同学们其实只需要了解一下就可以了。实际上我们实际写代码时,只要和父类写的一样就可以( 总结起来就8个字:声明不变,重新实现)
1、方法重写是什么?
子类写了一个方法名称,形参列表与父类某个方法一样的方法去覆盖父类的该方法。
2、重写方法有哪些注意事项?
建议加上:@Override注解,可以校验重写是否正确,同时可读性好。
子类重写父类方法时,访问权限必须大于或者等于父类被重写的方法的权限。
重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
私有方法、静态方法不能被重写。
3、方法重写有啥应用场景?
当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。
2.6 子类中访问成员的特点
- 原则:在子类中访问其他成员(成员变量、成员方法),是依据就近原则的
-
先子类局部范围找。
-
然后子类成员范围找。
-
然后父类成员范围找,如果父类范围还没有找到则报错。
- 如果子类和父类出现同名变量或者方法,优先使用子类的;此时如果一定要在子类中使用父类的成员,可以加this或者super进行区分。
2.7 子类中访问构造器的特点
子类中访问构造器的语法规则
- 首先,子类全部构造器,都会先调用父类构造器,再执行自己。
子类访问构造器的应用场景
- 如果不想使用默认的
super()方式调用父类构造器,还可以手动使用super(参数)调用父类有参数构造器。
总结:
子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先初始化赋值,
再回来把对象里包含子类这部分的数据也进行初始化赋值。
在本类中访问自己的构造方法
刚才我们学习了通过super()和super(参数)可以访问父类的构造器。有时候我们也需要访问自己类的构造器。语法如下:
this(): 调用本类的空参数构造器
this(参数): 调用本类有参数的构造器
public class Test3 {
public static void main(String[] args) {
// 目标:掌握在类的构造器中,通过this(...)调用兄弟构造器的作用。
Student s1 = new Student("柳岩", 18, "家里蹲大学");
System.out.println(s1.getName());
System.out.println(s1.getAge());
System.out.println(s1.getSchoolName());
System.out.println("=================");
// 需求:如果学生没有填写学校,那么学校默认就是胜雅教育
// 调用Student中2个参数的构造方法
Student s2 = new Student("刘涛", 20);
System.out.println(s2.getName());
System.out.println(s2.getAge());
System.out.println(s2.getSchoolName());
}
}
class Student{
private String name;
private int age;
private String schoolName;
public Student() {
}
public Student(String name, int age){
// 调用本类中3个参数的构造方法
this(name, age, "胜雅教育");
}
public Student(String name, int age, String schoolName) {
super();
this.name = name;
this.age = age;
this.schoolName = schoolName;
}
//...为了节省代码篇幅,这里省略了get和set方法...
}
this(...)和super(...)使用时的注意事项:
this(...) 、super(...) 都只能放在构造器的第一行,因此,有了this(...)就不能写super(...)了,反之亦然。
总结:
1、子类构造器有啥特点?
子类中的全部构造器,都必须先调用父类的构造器,再执行自己。
2、super(...)调用父类有参数构造器的常见应用场景是什么?
为对象中包含父类这部分的成员变量进行赋值。
3、this(...)的作用是什么?
在构造器中调用本类的其他构造器。
4、this(...)和super(...)的使用需要注意什么?
都必须放在构造器的第一行。