面向对象高级 继承(extends):

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 方法重写

什么是方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

注意:重写后,方法的访问遵循就近原则

    1. 重写小技巧:使用Override注解,它可以指定java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。
    1. 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限

public > protected > 缺省

    1. 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
    1. 私有方法、静态方法不能被重写,如果重写会报错。

关于这些注意事项,同学们其实只需要了解一下就可以了。实际上我们实际写代码时,只要和父类写的一样就可以( 总结起来就8个字:声明不变,重新实现

1、方法重写是什么?

子类写了一个方法名称,形参列表与父类某个方法一样的方法去覆盖父类的该方法。

2、重写方法有哪些注意事项?

建议加上:@Override注解,可以校验重写是否正确,同时可读性好。

子类重写父类方法时,访问权限必须大于或者等于父类被重写的方法的权限。

重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。

私有方法、静态方法不能被重写。

3、方法重写有啥应用场景?

当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。

2.6 子类中访问成员的特点

  • 原则:在子类中访问其他成员(成员变量、成员方法),是依据就近原则的
  1. 先子类局部范围找。

  2. 然后子类成员范围找。

  3. 然后父类成员范围找,如果父类范围还没有找到则报错。

  • 如果子类和父类出现同名变量或者方法,优先使用子类的;此时如果一定要在子类中使用父类的成员,可以加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(...)的使用需要注意什么?

都必须放在构造器的第一行。

相关推荐
前端老石人2 小时前
邂逅前端开发:从基础到实践的全景指南
开发语言·前端·html
白毛大侠2 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet2 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
elseif1232 小时前
浅谈 C++ 学习
开发语言·c++·学习
华科大胡子2 小时前
Chrome安全机制深度解析
python
易标AI3 小时前
标书智能体(四)——提示词顺序优化,让缓存命中,输入成本直降10倍
人工智能·python·提示词·智能体·招投标
SuperEugene3 小时前
Vue3 性能优化规范:日常必做优化(不玄学、可落地)|可维护性与兜底规范篇
开发语言·前端·javascript·vue.js·性能优化·前端框架
Binary-Jeff3 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法
Frank_refuel3 小时前
QT->信号与槽详解上(概述、使用、自定义、连接方式、其他说明)
开发语言·qt