七、面向对象编程(中级)

news2024/9/25 1:21:05

文章目录

  • 一、IDEA
    • 1.1 IDEA下载安装
    • 1.2 IDEA的使用
    • 1.3 IDEA常用的快捷键
  • 二、包
    • 2.1 包的基本介绍
    • 2.2 包的本质分析
    • 2.3 包的命名
    • 2.4 常用的包
    • 2.5 如何引入包
  • 三、访问修饰符
  • 四、面向对象的三大特征
    • 4.1 封装
    • 4.2 继承
      • 4.2.1 为什么需要继承
      • 4.2.2 继承的基本介绍
      • 4.2.3 继承的深入讨论/细节问题
      • 4.2.4 继承的本质分析(内存分析,重要)
    • 4.3 super关键字
    • 4.4 super与this的比较
    • 4.5 方法重写/覆盖(override)
    • 4.6 方法重写与重载比较
    • 4.7 多态
      • 4.7.1 基本介绍
      • 4.7.2 多态注意事项和细节讨论
      • 4.7.3 java的动态绑定机制(非常非常重要)
      • 4.7.4 多态的应用
  • 五、Object类详解
    • 5.1 equals方法
    • 5.2 hashCode方法
    • 5.3 toString()方法
    • 5.4 finalize方法
  • 六、断点调试
  • 七、细节知识
    • 7.1 访问修饰符
    • 7.2 继承的细节
    • 7.3 继承的本质分析(内存分析,重要)
    • 7.4 super细节
    • 7.5 方法重写的细节
    • 7.6 多态的理解
    • 7.7 java的动态绑定机制(非常非常重要)

一、IDEA

1.1 IDEA下载安装

在这里插入图片描述

1.2 IDEA的使用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.3 IDEA常用的快捷键

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、包

2.1 包的基本介绍

在这里插入图片描述

2.2 包的本质分析

在这里插入图片描述

2.3 包的命名

在这里插入图片描述

2.4 常用的包

在这里插入图片描述

2.5 如何引入包

在这里插入图片描述

建议:我们需要使用哪个类就导入哪个类,不建议使用 * 导入
在这里插入图片描述

在这里插入图片描述

三、访问修饰符

在这里插入图片描述

在这里插入图片描述

注:上述多个访问范围之间是或的关系(如:protected修饰的属性或方法可以被 同类同包子类 访问);另外 同包 指的是 完全相同的包路径(子包路径不算相同)

四、面向对象的三大特征

  • 基本介绍
    面向对象编程有三大特征:封装继承多态

4.1 封装

  • 基本介绍
    在这里插入图片描述

  • 封装的理解和好处
    在这里插入图片描述

  • 封装的实现步骤
    在这里插入图片描述

  • 快速入门
    在这里插入图片描述

public class Hello {

    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(900);

    }
}

class Person {
    public String name;
    private int age;
    private double salary;
    private String job;

    public Person() {
    }

    public Person(String name, int age, double salary, String job) {
        setAge(age);
        setJob(job);
        setName(name);
        setSalary(salary);
    }

    public void setName(String name) {
        if (name.length() >= 2 && name.length() <= 6) {
            this.name = name;
            return;
        }
        System.out.println("输入的名字长度必须在2-6之间");

    }

    public void setAge(int age) {
        if (age >= 1 && age <= 120) {
            this.age = age;
            return;
        }
        System.out.println("年龄必须在1-120");
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }

    public String getJob() {
        return job;
    }
}

4.2 继承

4.2.1 为什么需要继承

在这里插入图片描述

4.2.2 继承的基本介绍

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2.3 继承的深入讨论/细节问题

在这里插入图片描述

// 基础父类
package com.extends_;

public class Base {
    // 4个属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    public int getN4() { // 构建公共方法使子类可以访问私有属性
        return this.n4;
    }

    public Base() {
    }

    public void test100() {
        System.out.println("test100()....");
    }

    protected void test200() {
        System.out.println("test200()....");
    }

    void test300() {
        System.out.println("test300()....");
    }

    private void test400() {
        System.out.println("test400()....");
    }
}
// 子类(与父类同包)
package com.extends_;

public class Sub extends Base {

    public Sub() {
    }

    public void sayOk() {
        // 非私有的属性和方法可以在子类直接访问
        // 私有属性和方法不能在子类直接访问(n4无法直接访问)
        System.out.println(n1 + "" + n2 + "" + n3);

        int n4 = getN4();// 通过父类的公共方法对私有属性进行访问
        System.out.println("n4:"+n4);

        test100();
        test200();
        test300();
//        test400(); 无法直接访问

    }
}

在这里插入图片描述

在这里插入图片描述

  • 注意第6点,使用了this()后则编译器不会默认添加一个super()

在这里插入图片描述

在这里插入图片描述

4.2.4 继承的本质分析(内存分析,重要)

public class ExtendsTest{
    public static void main(String[] args){
        Son son = new son(); // 内存的布局
        System.out.println(son.age); // 访问父类中的属性age
    }
}

class GrandPa{
    String name = "大头爷爷";
    String hobby = "旅游";
}

class Father extends GrandPa{
    String name = "大头爸爸";
    int age = 39;
}

class Son extends Father{
    String name = "大头儿子";
}

在这里插入图片描述

  • 执行流程:
    1. 方法区加载类信息 ,顺序由继承关系决定(Object --> GrandPa --> Father --> Son)并建立类之间的关系
    2. 在堆中创建Son的实例,按继承关系创建属性初始化(各父类中的变量会存储在独立的二级堆空间中)
    3. 将Son实例的引用赋值给main方法栈中的son引用变量
    4. 若使用son调用属性方法,则遵守以下原则:
      1. 首先看子类是否有该属性 (方法)
      2. 如果子类有这个属性 (方法),并可以访问,则返回信息
      3. 如果子类没有这个属性 (方法),就看父类有没有这个属性 (方法)(如果父类有该属性 (方法),并可以访问,就返回信息…)
      4. 如果父类没有就按照(3)的规则,继续找上级父类,直到Object。注意:如果某一父类中有该属性 (方法)但由于访问修饰符限制(如:private)无法直接访问,则java编译器会停止向其父类寻找,直接返回无法访问的编译错误

4.3 super关键字

  • 基本介绍
    注意:super不是一个对象引用,super是一个指示java编译器调用父类实例域的特殊关键字
    在这里插入图片描述

  • super的细节
    在这里插入图片描述

public class A{
    public void say(){
        System.out.println("A say~~");
    }
}


public class B extends A{
    public void test(){
        // say();
        // this.say();
        super.say();
    }
}
  • 在B的方法中调用say()(与this.say()等同)的执行流程如下:
    1. 首先看子类是否有该属性 (方法)
    2. 如果子类有这个属性 (方法),并可以访问,则返回信息
    3. 如果子类没有这个属性 (方法),就看父类有没有这个属性 (方法)(如果父类有该属性 (方法),并可以访问,就返回信息…)
    4. 如果父类没有就按照(3)的规则,继续找上级父类,直到Object。注意:如果某一父类中有该属性 (方法)但由于访问修饰符限制(如:private)无法直接访问,则java编译器会停止向其父类寻找,直接返回无法访问的编译错误
      注意:使用 super.say() 会跳过上述第一步,直接从其父类开始查找

在这里插入图片描述

4.4 super与this的比较

在这里插入图片描述

4.5 方法重写/覆盖(override)

  • 基本介绍
    在这里插入图片描述

  • 方法重写注意事项和使用细节
    在这里插入图片描述

4.6 方法重写与重载比较

在这里插入图片描述

4.7 多态

4.7.1 基本介绍

在这里插入图片描述

在这里插入图片描述

注意 编译类型运行类型 的概念

4.7.2 多态注意事项和细节讨论

  • 调用方法使用运行类型,直接访问属性使用 编译类型
    在这里插入图片描述
public class Animal{
    public void eat(){
        System.out.println("...");
    }
}

class Cat extends Animal{
    public void eat(){ // 方法重写
        System.out.println("吃鱼");        
    }
}


class Dog extends Animal{
    public void eat(){ // 方法重写
        System.out.println("吃骨头");        
    }
}
public class Test{
    public static void main(String[] args){
        Animal animal = new Cat(); // 父类的引用指向了子类的实例
        // 可以调用父类中的所有成员(需要遵守访问权限)
        // 但是不能调用子类的特有的成员 (因为需要通过java的编译)
        // 因为在编译阶段,能调用哪些成员,是由编译类型来决定的
        // 最终的运行效果看子类的具体实现,即调用方法时,按照从子类开始查找方法
        // 然后调用,规则和我们前面讲的方法调用规则一致
        animal.eat(); // 调用重写的实现
    }
}

在这里插入图片描述

在这里插入图片描述

  • null 数据也可以使用 instanceof,其结果为 false
public class Test{
    public static void main(String[] args){
        BB bb = new BB();
        System.out.println(bb instanceof BB); // true
        System.out.println(bb instanceof AA); // true
        
        // aa的编译类型是AA,运行类型是BB
        AA aa = new BB();
        System.out.println(aa.n); // "a",说明访问的是编译类型对应的属性值
        System.out.println(aa instanceof AA); // true
        System.out.println(aa instanceof BB); // true,说明 instanceof 判断的是aa的运行类型是否是BB
    }
}

class AA{
    String n = 'a';
}

class BB extends AA{
    String n = 'b';
}

4.7.3 java的动态绑定机制(非常非常重要)

  1. 当调用对象 方法 的时候,该方法会和该对象的 内存地址/运行类型 绑定
  2. 当调用对象 属性 时,没有动态绑定机制,哪里声明,哪里使用
public class Test{
    public static void main(String[] args){
        A a = new B(); // 向上转型
        
        // 动态绑定机制: 
        // (1)调用 B 类继承的sum方法(sum() 与 B 的实例绑定,这里 this --> new B()); 
        // (2)其中getI() (同this.getI())则调用B中重写的方法; 
        // (3)B中的getI()方法中的 i (同this.i)没有动态绑定机制则返回B的成员变量I
        System.out.println(a.sum()); // 30
        
        // 动态绑定机制: 
        // (1)调用 B 类继承的sum1方法(sum1() 与 B 的实例绑定,这里 this --> new B()); 
        // (3)其中的 i (同this.i)没有动态绑定机制则返回A的成员变量I
        System.out.println(a.sum1()); // 20
        
    }
}

class A{ // 父类
    public int i = 10;
    public int sum(){
        return getI() + 10;
    }
    
    public int sum1(){
        return i + 10;
    }
    
    public int getI(){
        return i;
    }
}

class B{ // 子类
    public int i = 20;

    public int getI(){
        return i;
    }
}

4.7.4 多态的应用

在这里插入图片描述

在这里插入图片描述

五、Object类详解

5.1 equals方法

  • Object 类的 equals 方法实现的是判断是否是同一个对象
    在这里插入图片描述

在这里插入图片描述

// 自定义equals方法
public class Person{
    private String name;
    private int age;
    private char gender;
    
    public Person(String name, int age, char gender){
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    
    public boolean equals(Obejct obj){
        if (obj == this){
            return true;
        }
        if(obj instanceof Person){
            Person pObj = (Person) obj ;
            return this.name.equals(pObj .name) && this.age == pObj.age && this.gender == pObj.gender;
        }
        return false;
    }    

}

5.2 hashCode方法

在这里插入图片描述

5.3 toString()方法

在这里插入图片描述

5.4 finalize方法

在这里插入图片描述

六、断点调试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

七、细节知识

7.1 访问修饰符

  • 成员变量方法可以被:publicprotected默认private修饰
  • 类只能被:public默认修饰
    在这里插入图片描述

注:上述多个访问范围之间是或的关系(如:protected修饰的属性或方法可以被 同类同包子类 访问)。另外 同包 指的是 完全相同的包路径(子包路径不算相同)

7.2 继承的细节

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 注意第6点,使用了this()后则编译器不会默认添加一个super()

在这里插入图片描述

7.3 继承的本质分析(内存分析,重要)

public class ExtendsTest{
    public static void main(String[] args){
        Son son = new son(); // 内存的布局
    }
}

class GrandPa{
    String name = "大头爷爷";
    String hobby = "旅游";
}

class Father extends GrandPa{
    String name = "大头爸爸";
    int age = 39;
}

class Son extends Father{
    String name = "大头儿子";
}

在这里插入图片描述

  • 执行流程:
    1. 方法区加载类信息 ,顺序由继承关系决定(Object --> GrandPa --> Father --> Son)并建立类之间的关系
    2. 在堆中创建Son的实例,按继承关系创建属性初始化(各父类中的变量会存储在独立的二级堆空间中)
    3. 将Son实例的引用赋值给main方法栈中的son引用变量
    4. 若使用son调用属性方法,则遵守以下原则:
      1. 首先看子类是否有该属性 (方法)
      2. 如果子类有这个属性 (方法),并可以访问,则返回信息
      3. 如果子类没有这个属性 (方法),就看父类有没有这个属性 (方法)(如果父类有该属性 (方法),并可以访问,就返回信息…)
      4. 如果父类没有就按照(3)的规则,继续找上级父类,直到Object。注意:如果某一父类中有该属性 (方法)但由于访问修饰符限制(如:private)无法直接访问,则java编译器会停止向其父类寻找,直接返回无法访问的编译错误

7.4 super细节

注意:super不是一个对象引用(不能赋值给引用变量),super是一个指示java编译器调用父类实例域的特殊关键字
在这里插入图片描述

public class A{
    public void say(){
        System.out.println("A say~~");
    }
}


public class B extends A{
    public void test(){
        // say();
        // this.say();
        super.say();
    }
}
  • 在B的方法中调用say()(与this.say()等同)的执行流程如下:
    1. 首先看子类是否有该属性 (方法)
    2. 如果子类有这个属性 (方法),并可以访问,则返回信息
    3. 如果子类没有这个属性 (方法),就看父类有没有这个属性 (方法)(如果父类有该属性 (方法),并可以访问,就返回信息…)
    4. 如果父类没有就按照(3)的规则,继续找上级父类,直到Object。注意:如果某一父类中有该属性 (方法)但由于访问修饰符限制(如:private)无法直接访问,则java编译器会停止向其父类寻找,直接返回无法访问的编译错误
      注意:使用 super.say() 会跳过上述第一步,直接从其父类开始查找
      在这里插入图片描述

7.5 方法重写的细节

在这里插入图片描述

7.6 多态的理解

  • 注意 编译类型运行类型 的概念
  • 调用方法使用运行类型,直接访问属性使用 编译类型
    在这里插入图片描述

在这里插入图片描述

public class Animal{
    public void eat(){
        System.out.println("...");
    }
}

class Cat extends Animal{
    public void eat(){ // 方法重写
        System.out.println("吃鱼");        
    }
}


class Dog extends Animal{
    public void eat(){ // 方法重写
        System.out.println("吃骨头");        
    }
}
public class Test{
    public static void main(String[] args){
        Animal animal = new Cat(); // 父类的引用指向了子类的实例
        // 可以调用父类中的所有成员(需要遵守访问权限)
        // 但是不能调用子类的特有的成员 (因为需要通过java的编译)
        // 因为在编译阶段,能调用哪些成员,是由编译类型来决定的
        // 最终的运行效果看子类的具体实现,即调用方法时,按照从子类开始查找方法
        // 然后调用,规则和我们前面讲的方法调用规则一致
        animal.eat(); // 调用重写的实现
    }
}

在这里插入图片描述

在这里插入图片描述

public class Test{
    public static void main(String[] args){
        BB bb = new BB();
        System.out.println(bb instanceof BB); // true
        System.out.println(bb instanceof AA); // true
        
        // aa的编译类型是AA,运行类型是BB
        AA aa = new BB();
        System.out.println(aa.n); // "a",说明访问的是编译类型对应的属性值
        System.out.println(aa instanceof AA); // true
        System.out.println(aa instanceof BB); // true,说明 instanceof 判断的是aa的运行类型是否是BB
    }
}

class AA{
    String n = 'a';
}

class BB extends AA{
    String n = 'b';
}

7.7 java的动态绑定机制(非常非常重要)

  1. 当调用对象 方法 的时候,该方法会和该对象的 内存地址/运行类型 绑定
  2. 当调用对象 属性 时,没有动态绑定机制,哪里声明,哪里使用
public class Test{
    public static void main(String[] args){
        A a = new B(); // 向上转型
        
        // 动态绑定机制: 
        // (1)调用 B 类继承的sum方法(sum() 与 B 的实例绑定,这里 this --> new B()); 
        // (2)其中getI() (同this.getI())则调用B中重写的方法; 
        // (3)B中的getI()方法中的 i (同this.i)没有动态绑定机制则返回B的成员变量I
        System.out.println(a.sum()); // 30
        
        // 动态绑定机制: 
        // (1)调用 B 类继承的sum1方法(sum1() 与 B 的实例绑定,这里 this --> new B()); 
        // (3)其中的 i (同this.i)没有动态绑定机制则返回A的成员变量I
        System.out.println(a.sum1()); // 20
        
    }
}

class A{ // 父类
    public int i = 10;
    public int sum(){
        return getI() + 10;
    }
    
    public int sum1(){
        return i + 10;
    }
    
    public int getI(){
        return i;
    }
}

class B{ // 子类
    public int i = 20;

    public int getI(){
        return i;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2077951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++题解】1222. 经典递归问题——汉诺塔

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1222. 经典递归问题——汉诺塔 类型&#xff1a;递归、函数 题目描述&#xff1a; 汉诺塔&#xff08;又称河内塔&#xff09;问题是印度的一个古老的传说。开天辟地的神勃拉玛在一…

关于武汉芯景科技有限公司的MCU监控芯片XJ809S开发指南(兼容MAX809S)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、功能 当电源电压低于预设阈值时&#xff0c;芯片会发出复位信号&#xff0c;将微处理器或系统重置到初始状态&#xff0c;防止因电源问题导致的系统错误运行。复位信号在电源电压恢复并稳定后至少保持140ms&#xff0c;确保系统有…

HikariCP源码分析之源码环境搭建

一、fork源码库 为了方便记录以及查看一些历史的提交信息&#xff0c;我先在github上fork了这个源码库。 他的原始源码库位置为HikariCP源码位置 在fork到我的源码库之后&#xff0c;我就可以用git clone拉取下来&#xff0c;然后在我本地打开&#xff0c;做一些修改和笔记。然…

点云上采样

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

mysql regexp匹配多个字符串

项目场景&#xff1a; 数据结构 其中nameArr存储的是名字集合&#xff0c;现在的需求是传入"aaa","fff"&#xff0c;需要把包含这两个name的数据都查出来。 解决方案&#xff1a; 可以使用REGEXP来匹配包含多个特定ID的字符串。使用以下正则表达式&#x…

Linux1-初识Linux

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、硬件和软件 我们所熟知的计算机是由&#xff1a;硬件和软件所组成。 硬件&#xff1a;计算机系统中由电子&#xff0c;机械和光电元件等组成的各种物理装置的总称。 软件&#xff1a;是用户和…

复习Vue笔记(给自己做笔记)

基于脚手架创建前端工程 环境要求 node.js&#xff1a;前端项目的运行环境&#xff08;相当于Java的运行环境JDK&#xff09; npm&#xff1a;JS的包管理工具/器 Vue CLI&#xff1a;基于Vue进行快速开发的完整系统&#xff0c;实现交互式的项目脚手架 创建Vue基础项目代码&a…

从入门到专业,2024年精选录屏工具一网打尽

电脑录屏随着科技的飞速发展和数字化生活的普及已经成为了我们学习、日常工作、娱乐中不可或缺的一部分。本文将带你一起探索和班迪录屏一样大火的电脑录屏工具有哪些。 1.福昕REC大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这款软件体积小巧精致&#xff0c;不需要多…

【第81课】开发框架安全SpringBootStruts2LaravelThinkPHPCVE复现

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

Golang | Leetcode Golang题解之第376摆动序列

题目&#xff1a; 题解&#xff1a; int wiggleMaxLength(int* nums, int numsSize) {if (numsSize < 2) {return numsSize;}int prevdiff nums[1] - nums[0];int ret prevdiff ! 0 ? 2 : 1;for (int i 2; i < numsSize; i) {int diff nums[i] - nums[i - 1];if ((…

【JVM】剖析字符串与数组的底层实现(二)

剖析字符串与数组的底层实现 字符串jdk8和jdk9的区别 jdk8:底层是一个char[]数组 jdk9及之后:底层是一个byte[]数组 一个中文占两个字节&#xff0c;一个char占两个字节&#xff0c;一个byte占一个字节 Jdk9及之后的版本中&#xff0c;多了一个code属性&#xff0c;这个属性标…

深入掌握Kubernetes核心:YAML配置详解与实战

Kubernetes 的yaml配置文件 Kubernetes 的 YAML 配置文件是定义和管理集群中的所有资源的关键工具。了解如何编写和使用这些配置文件对管理 Kubernetes 集群至关重要。 1. 基础结构 Kubernetes YAML 配置文件通常由以下几个部分组成&#xff1a; apiVersion: 资源使用的 API …

公司同时使用目标(OKR)(KPI)的用例是什么?

简单的答案&#xff1a;所有使用OKR的公司都使用KPI。 长答案&#xff1a; 在公司层面&#xff0c;大多数OKR与关键绩效指标直接挂钩。举例说明&#xff0c;假设一家公司的目标是&#xff1a;”实现财务目标”&#xff0c;有以下3个关键结果。 1-第二季度公司收入翻番&#…

BeanFactoryPostProcessor 和 BeanPostProcessor

BeanFactoryPostProcessor 和 BeanPostProcessor 基本概念BeanFactoryPostProcessor简单实践BeanFactoryPostProcessor 典型应用BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor BeanPostProcessor简单实践AOP 简单实践 基本概念 BeanFactoryPostProcessor …

百度翻译与TOP3在线翻译伙伴:2024年的黄金组合

在这个信息丰富的时代&#xff0c;语言帮助人们跨越地域界限进行交流。随着全球化的发展&#xff0c;高效的在线翻译工具变得越来越重要&#xff0c;它能帮我们更好地了解世界和不同的文化。今天&#xff0c;我们就来看看百度翻译和它的三个新对手之间的比较&#xff0c;一起找…

redis作为缓存,mysql的数据如何与redis同步

先介绍自己的业务背景&#xff0c;是一致性要求高的 还是 允许延迟一致&#xff0c;因为两者的回答不一样。 双写一致性 双写一致性:当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致。 读操作:缓存命中&#xff0c;直接返回;缓存未命中…

动⼿学深度学习

大家如果想获取这个PDF可以关注&#xff0c;收藏点赞并私信我&#xff0c;我把这个PDF文档发给感兴趣的朋友 目录 预备知识 预备知识内容 线性神经网络 线性回归 基本元素 矢量化加速 正态分布与平方损失 从线性回归到深度网络 小结与练习 线性回归的实现 从零开始实现…

safari扩展程序开发

文章目录 safari_web_extensions开发扩展扩展有3个主要部分&#xff1a;使用 WebExtension APIruntime local debugSafari中允许运行 未签名的扩展install extensionupdate extension publish safari的extension文档不是很好&#xff0c;建议参考mozilla文档 https://developer…

【Python零基础】类的概念

文章目录 前言一、创建并使用类二、使用类和实例三、继承四、导入类五、Python标准库六、类的编码风格总结 前言 面向对象编程是现在使用最多的软件编写方法之一。面向对象中最核心的就是类(class)&#xff0c;类用来描述现实世界的事物和情景&#xff0c;我们基于这些类来创建…

信号的产生

文章目录 2 信号的产生2.1 键盘组合键2.2 命令和函数调用2.2.1 kill命令2.2.2 raise()函数2.2.3 abort()函数 2.3 硬件异常2.3.1 除0异常2.3.2 空指针异常2.3.3 OS如何感知这些异常--除0异常2.3.4 OS如何感知这些异常--空指针异常 2.4 软件条件2.4.1 13&#xff09;SIGPIPE信号…